FileSystemWatcher - 我会得到缓冲区溢出还是类似的?

时间:2012-12-18 10:14:50

标签: c# filesystemwatcher

我需要查看文件夹(在网络共享上),并在文件名更改并将文件移动到子目录(所有一个事件)时收到通知。此事件可能每天发生两次。我会有多个FileSystemWatchers来查看同一个文件的多个文件夹。

然而,FileSystemWatcher对于错过的事件而言是出了名的坏事,我不可能发生这种情况。我试过复制环境似乎工作但我不知道那是因为我特别做了什么。

如果我只关注OnRenamed个事件,我是否仍有可能遇到问题,或者我可以确定不会错过任何活动吗?

1 个答案:

答案 0 :(得分:0)

在正常工作的网络中,您不应该有任何与丢失事件相关的错误,但是您应该知道网络上的简单打嗝会使您的FileSystemWatcher监控无效。

与网络共享连接的短暂下降将在FileSystemWatcher中触发错误,即使重新建立连接,FileSystemWatcher也将不再收到任何通知。

这是在MSDN上找到的一个适应性很强的例子

static void Main()
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"\\yourserver\yourshare";
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    // Only watch text files.
    watcher.Filter = "*.txt";

    // Add handler for errors.
    watcher.Error += new ErrorEventHandler(OnError);

    // Begin watching.
    watcher.EnableRaisingEvents = true;

    // Wait for the user to quit the program.
    Console.WriteLine("Press \'q\' to quit the sample.");
    while(Console.Read()!='q');
}
private static void OnError(object source, ErrorEventArgs e)
{
    //  Show that an error has been detected.
    Console.WriteLine("The FileSystemWatcher has detected an error");

    //  Give more information if the error is due to an internal buffer overflow.
    Type t = e.GetException().GetType();
    Console.WriteLine(("The file system watcher experienced an error of type: " + 
                       t.ToString() + " with message=" + e.GetException().Message));
}

如果您尝试启动此控制台应用程序然后禁用网络连接,您将看到Win32Exception,但如果再次执行此操作,则运行的FileSystemWatcher将不会再看到错误事件