FileSystemWatcher 无法正常工作

Posted

技术标签:

【中文标题】FileSystemWatcher 无法正常工作【英文标题】:FileSystemWatcher not working properly 【发布时间】:2011-11-13 13:13:34 【问题描述】:

我正在使用 FileSystemWatcher 扫描从 Web 应用程序上传文件的文件夹。我有超过 1000 个文件上传到该文件夹​​。现在,问题是 FileSystemWatcher 在复制第一个文件时启动,有时它不适用于所有文件。任何建议都将受到高度评价。

【问题讨论】:

【参考方案1】:

FileSystemWatcher documentation 这么说(强调我的):

Windows 操作系统会通知您的组件文件更改 在 FileSystemWatcher 创建的缓冲区中。 如果有很多 在短时间内发生变化,缓冲区可能会溢出。这导致 组件丢失目录中的更改跟踪,它只会 提供一揽子通知。增加缓冲区的大小 InternalBufferSize 属性很昂贵,因为它来自 无法换出到磁盘的非分页内存,因此请保留 缓冲区小但足够大,不会错过任何文件更改事件。 为避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改 通知。

.

请注意,当缓冲区大小时,FileSystemWatcher 可能会错过一个事件 超过。为避免错过活动,请遵循以下准则:

通过设置 InternalBufferSize 属性增加缓冲区大小。

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

让您的事件处理代码尽可能短。

如果您尝试了以上方法,但对您来说仍然不够可靠,恐怕唯一的解决方案是订阅Error事件,并在发生时手动枚举目录内容。

【讨论】:

【参考方案2】:

详细说明乔恩的回答:

还有另一种可能的解决方案来推迟缓冲区溢出的发生。通过处理您监视的事件,例如 Created 事件,您可以尽快从缓冲区中删除与该事件相关的信息,以便它可以回收此空间。

为了加快速度,您可以选择异步处理文件。一旦触发事件,您就可以将文件的完整路径放入队列中,然后由工作线程处理。与 Created 事件相关的事件处理程序的职责被简化为将字符串(文件路径)添加到队列中。

例如:

public class FileProcessor

    private readonly Queue<string> files = new Queue<string>();

    public void EnqueueFile(string path)
    
        files.Enqueue(path);
    

附加到已创建事件的事件处理程序的代码可以最小化为:

static void file_Created(object sender, FileSystemEventArgs e)

    _fileProcessor.EnqueueFile(e.FullPath);

您可以在我大约两年前写的一篇文章中找到有关此的更多信息(包括示例代码):

https://github.com/geersch/FileSystemWatcher

【讨论】:

以上是关于FileSystemWatcher 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Ctrl+Shift+f(代码格式)在 Eclipse Helios 中无法正常工作

Visual Studio 2010“转到定义”/f12 无法正常工作 [重复]

创建同一个 FileSystemWatcher 的多个实例

C# 中的 FileStream 和 FileSystemWatcher,奇怪的问题“进程无法访问文件”

BMP 阅读器无法正常工作

System.IO.FileSystemWatcher