尽管采取了针对它的措施,FileSystemWatcher事件仍然提升了两次

我已经在这里和其他网站上浏览了不少线程来解决这个问题。

这是我的FileMonitor类:

class FileMonitor { public FileMonitor(String path) { try { var watcher = new FileSystemWatcher() { Path = path, IncludeSubdirectories = true, InternalBufferSize = 65536, EnableRaisingEvents = true }; watcher.Changed += new FileSystemEventHandler(OnFileChanged); watcher.Created += new FileSystemEventHandler(OnFileCreated); watcher.Deleted += new FileSystemEventHandler(OnFileDeleted); watcher.Renamed += new RenamedEventHandler(OnFileRenamed); watcher.Error += new ErrorEventHandler(OnWatcherError); } catch (Exception) { throw; } } private void OnWatcherError(object sender, ErrorEventArgs e) { } private void OnFileChanged(object sender, FileSystemEventArgs e) { try { ((FileSystemWatcher)sender).EnableRaisingEvents = false; LogFileSystemChanges(e); } finally { ((FileSystemWatcher)sender).EnableRaisingEvents = true; } } private void OnFileCreated(object sender, FileSystemEventArgs e) { try { ((FileSystemWatcher)sender).EnableRaisingEvents = false; LogFileSystemChanges(e); } finally { ((FileSystemWatcher)sender).EnableRaisingEvents = true; } } private void OnFileDeleted(object sender, FileSystemEventArgs e) { try { ((FileSystemWatcher)sender).EnableRaisingEvents = false; LogFileSystemChanges(e); } finally { ((FileSystemWatcher)sender).EnableRaisingEvents = true; } } private void OnFileRenamed(object sender, RenamedEventArgs e) { try { ((FileSystemWatcher)sender).EnableRaisingEvents = false; LogFileSystemRenaming(e); } finally { ((FileSystemWatcher)sender).EnableRaisingEvents = true; } } private void LogFileSystemChanges(FileSystemEventArgs e) { string log = string.Format("{0:G}: {1} | {2}", DateTime.Now, e.FullPath, e.ChangeType); Console.WriteLine(log); } private void LogFileSystemRenaming(RenamedEventArgs e) { string log = string.Format("{0:G}: {1} | Old name: {2}", DateTime.Now, e.FullPath, e.OldName); Console.WriteLine(log); } } 

你可以告诉我,我已经尝试了((FileSystemWatcher)sender).EnableRaisingEvents = false;的“锁定” ((FileSystemWatcher)sender).EnableRaisingEvents = false; ,但我可以从我的控制台输出告诉我的事件是触发两次。

有什么想法吗? 我真的不确定从哪里开始。

我遇到了同样的问题,经过多次努力得出结论, 记事本在行中写了三次(!)文件。 如果一个应用程序真的经常保存(可能是三角测量备份等),那么你可以做的事情就不多了。

我还注意到你已经附加了所有事件,你应该将它缩小到你需要的最小范围,并过滤掉那些你对NotifyFilters不感兴趣的东西。

我之前尝试过使用FileSystemWatcher类(很多年前它结果是 – 2008),并且遇到了重大问题。 这充其量是一个漏洞的抽象 。 我当时在CodeProject上报告了我的发现。 在评论列表中查找“Glytzhkof”。 我记得我几乎在class级的每个方面都遇到了问题,但是经过这么多年后它可能已经得到了改善

总而言之,我在当天的经历是,事件完全消失或堆积,导致基于变量的exception,例如磁盘的写入缓存是否已启用,是否访问了RAID,NAS或常规磁盘,以及其他我未发现的随机硬件问题回想一下。 有趣的是,似乎它与UNC路径一起工作。 不知道为什么。 映射驱动器失败。

请查看代码项目讨论中的摘要 。 我确信自从我尝试以后有一些改进,也许还有一些新的错误:-)。 磁盘存储硬件似乎很难作为高级抽象来处理 – 它泄漏了 。 我个人最终使用服务和常规磁盘function手动扫描文件。 在手动操作之前我浪费了很多时间。

更新 :请在此处查看新信息: https : //stackoverflow.com/a/23704476/129130