每当我订阅 FileSystemWatcher 通知时,当我创建新文件或更改现有文件时,都会发生多个事件。事件按以下顺序发生:
新建文件
已创建
已更改
已更改
已更改
已更改
已更改
已更改
改变
已更改
已删除
已更改
重命名
已更名
删除
已删除
重命名和删除正在按预期工作。 Created 和 Changed 被多次调用。
是否有任何解决方案/解决方法可以在添加/更改文件时获得准确的通知?
最佳答案
如果您查看 FSW 的 SDF 源代码,您会发现它实际上是围绕 native SHChangeNotifyRegister 调用的一个相当薄的托管填充程序,其中 dwEventMask 设置为 SHCNE_ALLEVENTS。窗口句柄被传递到 API,然后在发生更改时接收回调,并且这些回调被编码到 FSW 在托管端公开的托管事件。
现在查看回调,看起来有 9 个事件 ID 是句柄,其中四个引发 Changed 事件:
- SHCNE_UPDATEDIR
- SHCNE_RMDIR
- SHCNE_UPDATEITEM
- SHCNE_ATTRIBUTES
因此,当您创建新文件时,SHCNE_CREATE 会为您提供 Created 事件,然后是引发多个 Changed 事件的其他一些回调。更改事件上的所有事件参数是否都相同?如果是,您必须使用调试器单步执行 SDF 代码才能准确查看传入的内容以及实际的回调。
这里的小故事是,SDF 只是转发操作系统向其提供的事件。您看到所有这些事件的原因是操作系统发送它们。发送它们的确切原因可能是操作系统处理文件的方式,或者甚至可能特定于您正在使用的文件系统驱动程序(即在另一个设备上,它可能略有不同,甚至在系统中的另一个磁盘上)同一设备)。
我认为的解决方法是查看事件参数并对快速连续发生的相同文件名的事件进行“分组”。例如,如果您在一秒钟之内收到同一文件夹中同一文件名的一堆 Changed 和 Created 事件,那么很可能这是一个文件创建。
关于windows-mobile - OpenNETCF.IO.FileSystemWatcher 中多次发生的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920772/