.net - FileSystemWatcher 有时不工作

标签 .net filesystemwatcher

我设置了一个 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/

相关文章:

.net - 如何为使用 System.Diagnostics.Process.Start() 启动的控制台应用程序指定窗口标题?

c# - 多个 FileSystemWatcher 来监视本地系统上的文件?

C# : file copy notifying

c# - 将事件从 C# 应用程序传递到 Java 应用程序

c# - 有没有办法在 .net Framework 2 的 C# 应用程序中使用 linq?

C# BackgroundWorker 不工作

C# 如何在用户控件上显示文本气泡?

c# - 如何为多种文件类型设置 FileSystemWatcher 过滤器?

c# - 计时器委托(delegate)周围的内存泄漏