C#使用延遲的FileSystemWatcher來避免重復觸發事件
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
問題: 程序里需要監視某個目錄下的文件變化情況: 一旦目錄中出現新文件或者舊的文件被覆蓋,程序需要讀取文件內容并進行處理;但在實際處理中發現當一個文件產生變化時,Change事件被反復觸發了好幾次。這樣可能的結果是造成同一文件的重復處理。 解決方法: 針對上面的問題,于是寫了一個可以延遲FileSystemWatcher發出的事件的Class DelayFileSystemWatcher。 System; System.Collections.Generic; System.IO; System.Threading; Utility { DelayFileSystemWatcher { Timer m_Timer; Int32 m_TimerInterval; FileSystemWatcher m_FileSystemWatcher; FileSystemEventHandler m_FileSystemEventHandler; Dictionary<String, FileSystemEventArgs> m_ChangedFiles = Dictionary<, FileSystemEventArgs>(); DelayFileSystemWatcher( path, filter, FileSystemEventHandler watchHandler, timerInterval) { m_Timer = Timer(OnTimer, , Timeout.Infinite, Timeout.Infinite); m_FileSystemWatcher = FileSystemWatcher(path, filter); m_FileSystemWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.CreationTime; m_FileSystemWatcher.Created += fileSystemWatcher_Changed; m_FileSystemWatcher.Changed += fileSystemWatcher_Changed; m_FileSystemWatcher.Deleted += fileSystemWatcher_Changed; m_FileSystemWatcher.Renamed += fileSystemWatcher_Changed; m_FileSystemWatcher.EnableRaisingEvents = ; m_FileSystemEventHandler = watchHandler; m_TimerInterval = timerInterval; } fileSystemWatcher_Changed( sender, FileSystemEventArgs e) { (m_ChangedFiles) { (!m_ChangedFiles.ContainsKey(e.Name)) { m_ChangedFiles.Add(e.Name, e); } } m_Timer.Change(m_TimerInterval, Timeout.Infinite); } OnTimer( state) { Dictionary<String, FileSystemEventArgs> tempChangedFiles = Dictionary<String, FileSystemEventArgs>(); (m_ChangedFiles) { (KeyValuePair<, FileSystemEventArgs> changedFile m_ChangedFiles) { tempChangedFiles.Add(changedFile.Key, changedFile.Value); } m_ChangedFiles.Clear(); } (KeyValuePair<, FileSystemEventArgs> changedFile tempChangedFiles) { m_FileSystemEventHandler(, changedFile.Value); } } } 使用方式如下: s_DelayFileSystemWatcher = new DelayFileSystemWatcher(@"C:\Temp", "*.xml", fileSystemWatcher_Changed, 1500); 該文章在 2023/12/26 22:58:24 編輯過 |
關鍵字查詢
相關文章
正在查詢... |