FileSystemWatcher陷阱

Ton*_*ile 4 c# filesystemwatcher

我正在开发一个需要使用FileSystemWatcher该类的C#程序,以便在创建新文件时通知它.作为初始化的一部分,程序扫描目录,以便它可以处理其中已存在的任何文件.这一切都很好.

但是,在与另一位开发人员的讨论中,我们开始质疑这是否始终有效.是否存在FileSystemWatcher错过创建文件的条件?如果是这样,这些条件是什么?

为了处理这种情况,我们只是在初始化过程中运行代码,定期扫描目录,但是FileSystemWatcher错过文件的可能性有多大?

Tho*_*que 12

FileSystemWatcher不会通常错过文件.然而:

  • 因为它基于ReadDirectoryChangesW,它只检测文件目录条目的更改,而不是文件本身的更改.对文件的大多数更改都将更新目录条目,但有一些例外(请参阅此文章).
  • 文件更改通知的缓冲区大小有限; 如果你没有足够快地处理事件,缓冲区将溢出,导致你错过事件.这就是为什么你不应该在事件处理程序中进行任何繁重的处理; 如果您无法足够快地处理事件,只需将它们添加到您在另一个线程上处理的队列中.

其他陷阱:

  • 通知不会立即到达; 实际更改和通知之间的延迟通常很短,但我已经看到它长到几秒钟.对于大多数用例而言,这不是主要问题,但取决于您尝试做什么,这可能是一个问题.
  • 没有事件Moved.如果将文件从目录移动到另一个目录,您将收到两个通知:DeletedCreated
  • 有时,根据卷配置,通知中的路径可以采用旧的8.3格式(例如,您可以获取SOMETH~1.TXT而不是Something.txt)
  • 如果将现有的非空目录移动到监视目录中,则只会获得目录本身的通知,而不是其内容.您需要手动检查内容.
  • Changed对于同一文件,事件可能会多次发生; 你需要自己处理重复