我有一个Windows应用程序,它管理具有长路径的文件和目录。我有一个FileSystemWatcher来监视父目录及其所有子项,但我遇到了问题,因为当项目超过200个字符(或多或少)时,应用程序不会收到它的事件。
例如,当有一个文件或目录有长路径时,应用不会在删除或重命名此项目时收到该事件。对于所有其他具有短路径的元素,FileSystemWatcher工作正常,应用程序能够管理收到的事件。
有人知道另一种形式来监控长路径的元素吗?任何支持长路径的FileSystemWatcher或类似的东西?
提前致谢
答案 0 :(得分:1)
你可能正在溢出缓冲区。 FileSystemWatcher
的默认缓冲区大小只有8 Kb,长文件名可以真正吃到它。见here:
系统通知组件文件更改,并将这些更改存储在组件创建的缓冲区中并传递给API。每个事件最多可使用16个字节的内存,不包括文件名。如果在短时间内有许多变化,缓冲区可能会溢出。这会导致组件无法跟踪目录中的更改,并且只会提供一揽子通知。增加缓冲区的大小可以防止丢失文件系统更改事件。但是,增加缓冲区大小是很昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区。要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性过滤掉不需要的更改通知。
另见备注here:
避免观看具有长文件名的文件,因为长文件名有助于填充缓冲区。考虑使用较短的名称重命名这些文件。
而且:
通用文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会引发几个OnChanged和一些OnCreated和OnDeleted事件。移动文件是一项复杂的操作,由多个简单操作组成,因此可以引发多个事件。同样,某些应用程序(例如,防病毒软件)可能会导致FileSystemWatcher检测到其他文件系统事件。
因此,具有长文件名的单个操作可能会触发多个事件,每个事件都使用长文件名来消耗缓冲区块。
另一种方法是设置一个计时器,以便在某个时间间隔内自己轮询目录(取决于您的应用程序的需求),并与上次轮询进行比较以检测已更改的内容。
此question对该主题进行了一些讨论。