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 无法正常工作 [重复]