C# FileSystemWatcher-是否会出现缓冲区溢出或类似情况?
我需要监视一个文件夹(在网络共享上),并在文件名更改和文件移动到子目录(所有一个事件)时收到通知。这一事件可能一天发生两次。我将有多个C# FileSystemWatcher-是否会出现缓冲区溢出或类似情况?,c#,filesystemwatcher,C#,Filesystemwatcher,我需要监视一个文件夹(在网络共享上),并在文件名更改和文件移动到子目录(所有一个事件)时收到通知。这一事件可能一天发生两次。我将有多个FileSystemWatchers来监视同一事物的多个文件夹 然而,FileSystemWatcher对于丢失事件是出了名的糟糕,我不能让这种情况发生。我尝试过复制环境,它似乎很有效,但我不知道这是否是因为我正在做一些特别的事情 如果我只监视重命名后的事件,我是否仍然可能有问题,或者我是否可以确保不会错过事件?在正常工作的网络中,您不应该有任何与丢失事件相关的错
FileSystemWatchers
来监视同一事物的多个文件夹
然而,FileSystemWatcher
对于丢失事件是出了名的糟糕,我不能让这种情况发生。我尝试过复制环境,它似乎很有效,但我不知道这是否是因为我正在做一些特别的事情
如果我只监视重命名后的
事件,我是否仍然可能有问题,或者我是否可以确保不会错过事件?在正常工作的网络中,您不应该有任何与丢失事件相关的错误,但您应该知道,网络上的一个简单故障将使您的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));
}
如果您尝试启动此控制台应用程序,然后禁用网络连接,您将看到Win32异常,但如果您再次这样做,运行的FileSystemWatcher将不会再看到错误事件,您的问题与它的标题有什么关系?我看不到任何关于缓冲区溢出的情况。使用默认缓冲区大小,最糟糕的情况是它可以存储15个事件。更典型的是大约30或40,这取决于文件路径名的长度。当然,这不会在每天发生两次的重命名事件上进行测试。@Hans Passant所有FileSystemWatcher
s出于兴趣使用相同的缓冲区吗?不,每个观察者都有自己的缓冲区。