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 编辑过 |
关键字查询
相关文章
正在查询... |