我需要监视一个文件夹(在网络共享上),并在文件名更改并且文件被移动到子目录(所有一个事件)时收到通知。此事件可能每天发生两次。对于同一件事,我将有多个FileSystemWatchers
观看多个文件夹。
然而,FileSystemWatcher
对于错过事件是出了名的糟糕,我不能让这种情况发生。我尝试过复制环境,它似乎可以工作,但是我不知道这是否是因为我正在做一些特别的事情。
如果我只关注OnRenamed
事件,我是否仍然可能有问题,或者我可以确定我不会错过事件吗?
我需要监视一个文件夹(在网络共享上),并在文件名更改并且文件被移动到子目录(所有一个事件)时收到通知。此事件可能每天发生两次。对于同一件事,我将有多个FileSystemWatchers
观看多个文件夹。
然而,FileSystemWatcher
对于错过事件是出了名的糟糕,我不能让这种情况发生。我尝试过复制环境,它似乎可以工作,但是我不知道这是否是因为我正在做一些特别的事情。
如果我只关注OnRenamed
事件,我是否仍然可能有问题,或者我可以确定我不会错过事件吗?
在正常工作的网络中,您不应该有任何与丢失事件相关的错误,但您应该知道,网络上的一个简单故障将使您的 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 将不会再看到错误事件