FileSystemWatcher用于包含路径太长的项目的目录

时间:2016-06-13 14:40:19

标签: c# filesystemwatcher

我有一个Windows应用程序,它管理具有长路径的文件和目录。我有一个FileSystemWatcher来监视父目录及其所有子项,但我遇到了问题,因为当项目超过200个字符(或多或少)时,应用程序不会收到它的事件。

例如,当有一个文件或目录有长路径时,应用不会在删除或重命名此项目时收到该事件。对于所有其他具有短路径的元素,FileSystemWatcher工作正常,应用程序能够管理收到的事件。

有人知道另一种形式来监控长路径的元素吗?任何支持长路径的FileSystemWatcher或类似的东西?

提前致谢

1 个答案:

答案 0 :(得分:1)

你可能正在溢出缓冲区。 FileSystemWatcher的默认缓冲区大小只有8 Kb,长文件名可以真正吃到它。见here

  

系统通知组件文件更改,并将这些更改存储在组件创建的缓冲区中并传递给API。每个事件最多可使用16个字节的内存,不包括文件名。如果在短时间内有许多变化,缓冲区可能会溢出。这会导致组件无法跟踪目录中的更改,并且只会提供一揽子通知。增加缓冲区的大小可以防止丢失文件系统更改事件。但是,增加缓冲区大小是很昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区。要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性过滤掉不需要的更改通知。

另见备注here

  

避免观看具有长文件名的文件,因为长文件名有助于填充缓冲区。考虑使用较短的名称重命名这些文件。

而且:

  

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

因此,具有长文件名的单个操作可能会触发多个事件,每个事件都使用长文件名来消耗缓冲区块。

另一种方法是设置一个计时器,以便在某个时间间隔内自己轮询目录(取决于您的应用程序的需求),并与上次轮询进行比较以检测已更改的内容。

question对该主题进行了一些讨论。