【问题标题】:Why does FileSystemWatcher create multiple change events when I copy a file to the directory为什么当我将文件复制到目录时 FileSystemWatcher 会创建多个更改事件
【发布时间】:2008-10-05 14:24:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net filesystems filesystemwatcher


    【解决方案1】:

    根据documentation(参见事件和缓冲区大小下的第一个要点):

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

    【讨论】:

    • @Alex Lyman:+1,您还可以提及使用 Process Monitor 来查看这两个更改操作的确切内容。
    【解决方案2】:

    通常复制程序是在块中进行的,而不是一次整个文件。我认为您无法采取任何措施来避免这种情况,您将不得不采用您的算法来处理这种情况。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多