0

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

然而,FileSystemWatcher对于错过事件是出了名的糟糕,我不能让这种情况发生。我尝试过复制环境,它似乎可以工作,但是我不知道这是否是因为我正在做一些特别的事情。

如果我只关注OnRenamed事件,我是否仍然可能有问题,或者我可以确定我不会错过事件吗?

4

1 回答 1

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 将不会再看到错误事件

于 2012-12-18T10:46:23.733 回答