2

每当我订阅 FileSystemWatcher 通知时,当我创建新文件或更改现有文件时都会发生多个事件。事件按以下顺序发生:

新文件

已创建

改变了

改变了

改变了

改变了

改变了

改变了

改变

改变了

已删除

改变了

改名

重命名

删除

已删除

重命名和删除按预期工作。Created 和 Changed 被多次调用。

是否有任何解决方案/解决方法可以在添加/更改文件时获得准确的通知?

4

1 回答 1

3

如果您查看 FSW 的 SDF 源代码,您会发现它实际上是一个非常薄的托管 shim,它围绕本机 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 事件,那么很可能这是一个文件创建。

于 2010-10-13T04:48:49.940 回答