private void FileSystemWatcher(string path) { FileSystemWatcher watcher = new FileSystemWatcher(); try { watcher.Path = path; } catch (ArgumentException e) { Record("错误:" + e.Message); return; } watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.Size; watcher.IncludeSubdirectories = true; watcher.EnableRaisingEvents = true; watcher.Filter = "*.*"; watcher.Created += new FileSystemEventHandler(this.FileChange_EventHandle); watcher.Deleted += new FileSystemEventHandler(this.FileChange_EventHandle); watcher.Changed += new FileSystemEventHandler(this.FileChange_EventHandle); watcher.Renamed += new RenamedEventHandler(this.FileChange_Renamed); } DateTime lastRead = DateTime.MinValue; private void FileChange_EventHandle(object source, FileSystemEventArgs e) { //Record("测试FileChange_EventHandle"); DateTime lastWriteTime = File.GetLastWriteTime(e.FullPath); if (lastRead != lastWriteTime) { Record($"测试FileChange_EventHandle_{e.ChangeType.ToString()}\r\n{lastRead.ToString()}\r\n{lastWriteTime.ToString()}\r\n{e.FullPath}\r\n{DateTime.Compare(lastRead, lastWriteTime)}"); lastRead = lastWriteTime; } }
尝试以时间来进行判断,但是诡异的是时间一样还是会进入判断
请问下有什么方法能让changed事件只执行一次?
我用的是记事本测试,并没有复现你的问题。该触发一次还是一次……
。。。不知道什么情况了
watcher.Created += new FileSystemEventHandler(this.FileChange_EventHandle);
watcher.Deleted += new FileSystemEventHandler(this.FileChange_EventHandle);
watcher.Changed += new FileSystemEventHandler(this.FileChange_EventHandle);
有没有可能是Created
事件也被触发导致的
可以在事件处理程序里把文件内容打印出来进行调试
我用了e.ChangeType.ToString()来看触发的事件都是change,也把created事件取消过,还是会触发两次
@bgh: 在事件处理程序里把文件内容打印出来进行调试,看看是什么东西变了,或者把中文输入法关了试试?
@Laggage: 内容没变,一模一样。。。关闭中文输入法也是触发两次。。。
@bgh: 我看到了这一行
watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.Size;
NotifyFilters.Size
这个应该也有影响的吧
@bgh: 把watcher.NotifyFilter
这一行注释掉用默认值
@Laggage: 注释size的话我该了内容也不触发change了,使用默认的话还是触发了两次。。。
你自己设置断点到FileChange_EventHandle事件处理函数当中,运行一下看看就知道了。
我也遇到这个问题,不知道change事件为啥连续触发执行两次