为什么当我将文件复制到目录中时,FileSystemWatcher会创建多个更改事件?

4

我使用 .Net FileSystemWatcher 写了一个小型测试应用程序来监视一个目录。当我将一个相对较大的文件(几 MB)复制到该目录时,我会看到以下列出的事件(请参见屏幕截图 - 并忽略一开始的删除事件)。

alt text http://robinwilson.homelinux.com/FSW.png

我收到了一个创建事件(如预期),但接下来是两个更改事件(相隔约0.7秒)。这是为什么?这会在我计划开发的应用程序中造成严重问题 - 因为我会尝试两次处理该文件(可能在它完成写入之前就已经进行一次!)。有没有办法阻止这种情况发生?根据我在 StackOverflow 和其他地方阅读的内容,一旦文件被更改并关闭,您应该只会收到一个更改事件。为什么我会得到两个?

2个回答

11
根据文档 (请参见 事件和缓冲区大小 下的第一个项目):

常见的文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会触发多个 OnChanged 事件以及一些 OnCreated 和 OnDeleted 事件。移动文件是一个由多个简单操作组成的复杂操作,因此会引发多个事件。同样,一些应用程序(例如,防病毒软件)可能会导致额外的文件系统事件被 FileSystemWatcher 检测到。


@Alex Lyman:+1,你还可以提到使用“Process Monitor”来查看这两个更改操作的具体情况。 - user7116

2
通常复制程序是分块进行的,而不是一次性复制整个文件。我认为你无法避免这种情况,你需要调整算法来处理它。
你可以尝试以独占读取权限打开文件,只有在其他程序完成复制并关闭文件后才授予你的程序此权限。否则,你将收到IOException并等待下一次更改。但这并不意味着你不应该处理多次更改事件。在记事本中打开文本文件并偶尔保存它会生成更改事件,但文件不会一直被锁定。
另一种方法是在一段时间内收集受影响的文件,当FileSystemWatcher停止生成事件时,一次性处理所有文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接