我有一个 FileSystemWatcher 设置来检查新文件,将内容存储在数据库中并删除文件。大约 10 天前,它开始忽略一些文件。我们谈论的是总共 50,000 个文件中的 1,500 个文件。通过手动将文件移动到不同的目录,然后再次将它们移动到监视目录,文件会被注意到。
InternalBufferSize 设置为 32 kB 以处理大批量。它可以一次处理 300 多个文件而不会出现问题,而现实甚至还差得远。
该程序最后一次接触是在 40 多天前,进行了与 FileSystemWatcher 无关的更改。它已经投入生产一年多了。在服务器负载中看不到峰值。
什么会导致这样的问题突然出现? FileSystemWatcher 是否有可能只是 unreliable ?
编辑
我创建了一个测试,其中创建了 1,000 个文件。运行它后,可以在事件日志中找到 3,000 个条目。所以我相信缓冲区溢出是不可能的?
private void button1_Click(object sender, EventArgs e)
{
fsw = new FileSystemWatcher();
fsw.Path = @"C:\temp\fsw-test";
fsw.IncludeSubdirectories = false;
fsw.NotifyFilter = NotifyFilters.FileName;
fsw.Created += new FileSystemEventHandler(fsw_Created_handler);
fsw.EnableRaisingEvents = true;
fsw.InternalBufferSize = 32768;
fsw.Error += fsw_Error_handler;
}
private void fsw_Created_handler(object sender, FileSystemEventArgs e)
{
new Thread(new ParameterizedThreadStart(work)).Start(e);
}
private void fsw_Error_handler(object sender, ErrorEventArgs e)
{
EventLog.WriteEntry("few test", e.GetException().Message);
}
private void work(object e)
{
try
{
EventLog.WriteEntry("fsw test", "Queueing File Started");
Thread.Sleep(10000);
EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name);
EventLog.WriteEntry("fsw test", "Queueing File Done");
}
catch (Exception ex)
{
EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString());
}
}
private void button2_Click(object sender, EventArgs e)
{
for (int i = 1; i <= 1000; i++)
{
System.IO.File.Create(@"C:\temp\fsw-test\" + i);
}
}
编辑 2
以多种方式对程序进行压力测试,并一遍又一遍地检查代码,没有发现任何问题。所以现在这是一个无法重现的错误,我将做一些更改以使其更频繁地记录并监控情况。
最佳答案
文件事件不排队。如果您正在处理一个文件,并且创建了新文件,您将错过这些事件。
解决此问题的一种方法是,当发生新文件事件时,处理文件并在返回之前检查新文件。循环直到没有文件。
关于.net - FileSystemWatcher 有时不工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9263363/