【问题标题】:FileSystemWatcher for directory with items with paths too longFileSystemWatcher 用于包含路径太长的项目的目录
【发布时间】:2016-10-14 01:01:27
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

    标签: c# filesystemwatcher


    【解决方案1】:

    很可能您正在溢出缓冲区。 FileSystemWatcher 的默认缓冲区大小仅为 8 Kb,而长文件名确实会占用它。见here

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

    另见注释here

    避免使用长文件名查看文件,因为长文件名会导致缓冲区被填满。考虑使用较短的名称重命名这些文件。

    还有这个:

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

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

    另一种方法是设置一个计时器,以自己在某个时间间隔(取决于您的应用程序的需要)轮询目录,并与上次轮询进行比较以检测发生了什么变化。

    这个question有一些关于这个话题的讨论。

    【讨论】:

    • 我尝试将缓冲区大小增加到 64KB,但应用程序继续运行而不会收到已删除或重命名元素的事件(仅适用于具有长路径的项目)。我对如何在重命名或删除项目时手动检查存在疑问。当事件发生时,应用程序需要对事件做出快速响应,几乎是立即响应。可以说,当用户在 Windows 资源管理器中与文件或目录交互时,其行为类似于 Dropbox、OneDrive...。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多