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