FileSystemWatcher工作不正常
本文关键字:不正常 工作 FileSystemWatcher | 更新日期: 2023-09-27 18:07:58
我正在使用FileSystemWatcher扫描从web应用程序上传文件的文件夹。我有超过1000个文件上传到这个文件夹。现在,问题是FileSystemWatcher在复制第一个文件时启动,有时,它并不适用于所有文件。如有任何建议,我将不胜感激。
FileSystemWatcher
文档说(强调我的):
Windows操作系统通知您的组件的文件更改在由FileSystemWatcher创建的缓冲区中。如果有很多在短时间内发生变化,缓冲区就会溢出。这会导致组件将失去对目录更改的跟踪,并且它只会提供毛毯通知。增加缓冲区的大小InternalBufferSize属性是昂贵的,因为它来自不能交换到磁盘的非分页内存,因此保留缓冲区足够小,但又足够大,不会错过任何文件更改事件。要避免缓冲区溢出,请使用NotifyFilter和inclesubdirectories属性,这样你就可以过滤掉不想要的更改通知。
.
注意,FileSystemWatcher可能会错过一个事件,当缓冲区大小是超过。要避免错过事件,请遵循以下指导原则:
通过设置InternalBufferSize属性来增加缓冲区的大小。
避免观看长文件名的文件,因为长文件名有助于填充缓冲区。考虑重命名这些文件使用更短的名称。
让你的事件处理代码尽可能的短。
如果您已经尝试了上述方法,但它仍然不够可靠,恐怕唯一的解决方案是订阅Error
事件,并在发生时手动枚举目录内容。
详细说明Jon的回答:
还有另一种可能的解决方案可以延迟缓冲区溢出的发生。通过处理您所监视的事件,例如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