4

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

替代文字 http://robinwilson.homelinux.com/FSW.png

我得到了一个创建的事件(如预期的那样),但随后发生了两个更改的事件(相隔约 0.7 秒)。为什么是这样?这将导致我计划开发的应用程序出现重大问题 - 因为我会尝试对文件执行两次操作(大概在完成写入之前一次!)。我能做些什么来阻止这种情况的发生吗?从我在 StackOverflow 和其他地方读到的内容来看,一旦文件被更改然后关闭,您应该只得到一个更改的事件。为什么我要两个?

4

2 回答 2

11

根据文档(请参阅Events and Buffer Sizes下的第一个要点):

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

于 2008-10-05T14:37:56.213 回答
2

通常,复制程序是以块的形式进行的,而不是一次整个文件。我不认为你可以做任何事情来避免这种情况,你将不得不采用你的算法来处理这个问题。

您可以尝试以独占读取权限打开文件,只有在其他程序完成复制并关闭文件时才应授予您的程序。否则你会得到 IOException 并且你可以等待下一次更改。但这并不意味着您不应该处理多重变化事件。在记事本中打开文本文件并偶尔保存会产生更改事件,但文件不会一直被锁定。

另一种方法是在一段时间内收集触摸的文件,当 FileSystemWatcher 停止生成事件时,一次处理所有文件。

于 2008-10-05T14:29:32.300 回答