每当我订阅FileSystemWatcher通知时,在创建新文件或更改现有文件时都会发生多个事件。事件按以下顺序发生:
新文件
创建
更改
更改
更改
更改
更改
更改
更改
更改
删除
更改
重命名
重命名
删除
删除
重命名和删除按预期工作。多次调用Created和Changed。
是否有任何解决方案/解决方法可以在添加/更改文件时获得准确的通知?
答案 0 :(得分:3)
如果你看一下FSW的SDF源代码,你会发现它实际上是一个非常薄的托管垫片,围绕本机SHChangeNotifyRegister调用,并且dwEventMask设置为SHCNE_ALLEVENTS。窗口句柄传递给API,然后在发生更改时接收回调,并将这些回调编组到FSW在托管端公开的托管事件上。
现在查看回调,看起来有9个事件ID是句柄,其中四个引发了Changed事件:
因此,当您创建一个新文件时,它的SHCNE_CREATE会为您提供Created事件,然后是其他一些回调,会引发一些Changed事件。变更事件中的所有事件参数是否相同?如果是,则必须使用调试器逐步查看SDF代码,以确切了解正在进行的操作以及实际的回调。
这里的简短故事是SDF只是转发操作系统给它的事件。您看到所有这些事件的原因是因为操作系统发送它们。它正在发送它们的确切原因可能是操作系统处理文件的方式,或者它甚至可能特定于您正在使用的文件系统驱动程序(即在另一台设备上它可能略有不同,甚至在另一台磁盘上相同的设备)。
我认为解决方法是查看事件args并将事件“分组”为快速连续发生的相同文件名。例如,如果你在一秒钟内在同一个文件夹中获得了一堆Changed和一个Created事件,那么可以肯定它是一个文件创建。