文件监控。出于某种原因,当对文件进行更改时,Change. 如何解决?
这是代码:
public void monitoring(string path)
{
this.sPath = path;
string first = Path.GetDirectoryName(path);
string second = Path.GetFileName(path);
FileSystemWatcher fsw = new FileSystemWatcher(first, second);
fsw.Changed += new FileSystemEventHandler(watcher_Changed);
fsw.EnableRaisingEvents = true;
}
public void watcher_Changed(object sender, FileSystemEventArgs e)
{
MessageBox.Show("Be happy :3");
SplitAndQuery(this.sPath);
}
事实上,它
FileSystemWatcher依赖于来自操作系统的通知。并且将更改写入文件可能并不总是一个原子操作:例如,notepad.exe 分几个步骤写入磁盘,分别将文件及其属性分开,这将需要多次触发事件Changed。或者在复制/移动文件时,记录分几个步骤进行。您可以尝试以不同的方式摆脱它。最具体但并不总是合适的方法是禁用事件的生成。但是你需要小心使用它,因为。您可以跳过其他有用的更改。
另一种方法是依赖文件的最后修改日期(也可以选择 on
e.ChangeType):如果文件不经常更改,并且事件一个接一个地发生,那么您可以使用带有一些等待和切断事件的计时器,这些事件还没有经过所需的时间量。
通常,支柱解决方案的选择取决于您的要求(但是,像往常一样:))。
没办法,请记住该事件会触发两次。这是正常的
FileSystemWatcher。具体的决定要视情况而定。我通常在类中保留信息,帮助我了解是否应该处理当前事件
changed——最后修改时间、文件的当前位置、文件的存在等。反解决方案是危险的,因为 忽略可能的其他更改。
有一个延迟执行的选项,只有在等待时才会跳过更改。
我找到了适合我的解决方案,但并不是说它适合所有人: