.Net FileWatcher失败~80 +文件

时间:2009-06-02 17:30:01

标签: c# .net

我正在使用.net 2.0 filewatcher来查看新文件的文件夹。除非我一次放置超过80个文件,否则它的效果非常好。该事件不再触发。好像filewatcher设置为跟踪特定数量的文件。

暂时我已经要求用户不要一次放置超过50个文件,但这似乎有效,但我想修复它,以便一次可以将数百个文件放入文件夹。

这是我正在使用的代码。这是非常标准的东西,没什么特别的。


FileWatcher = new FileSystemWatcher();
FileWatcher.Path = ConfigurationManager.AppSettings["FolderOfFilesToWatch"];
FileWatcher.NotifyFilter = NotifyFilters.FileName;
FileWatcher.Filter = "*_*_*.*";
FileWatcher.Created += new FileSystemEventHandler(watcher_Created);
FileWatcher.EnableRaisingEvents = true;


static void watcher_Created(object sender, FileSystemEventArgs e)
{
Console.Write(e.Name);
}

有什么想法吗?

4 个答案:

答案 0 :(得分:14)

您可能需要增加FileSystemWatcher。InternalBufferSize。默认情况下,FileSystemWatcher使用较小的缓冲区来提高性能,如果在短时间内发生太多更改,则可能会溢出。

尝试设置更大的缓冲区大小以防止发生这种情况。

答案 1 :(得分:2)

我使用FileWatcher,但我采取了“腰带和吊带”的方法。每当我收到FileWatcher事件时,我都会坚持并检查以前没有见过的文件(在我的情况下,我有一个文件目录)。相信我,有一段时间你会把数千个文件放在一个文件夹中,你必须有另一个安全措施来解释所有文件。

您可以考虑的另一个替代方案是change journals,虽然它是(AFAIK)仅限于连接到您机器的磁盘,而您也可以使用FileWatcher来监视UNC路径。

答案 2 :(得分:1)

您可能超出了系统的ThreadPool数量。当FileSystemWatcher触发事件时,它会从从此池中检索到的线程执行此操作。如果您没有为ThreadPool分配足够的线程,则可能会丢失这些事件。

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

与其他人一样,尤其是'ocdecio'已经注意到不完全信任FileSystemWatcher是好的。在繁重的负载下,这是出了名的不一致。

答案 3 :(得分:0)

不管你信不信,CIFS股票都有自己需要注意的一些设置。 50显然是大多数文件共享命令计数的默认值(我不知道这个除了术语以外的任何其他内容......对不起)

无论如何 - 这个问题一直困扰着我们 - 幸运的是我们的存储供应商非常友好地解决了这个问题。

在这里看看,看看这是否可以帮助你克服魔法50 ......

http://support.microsoft.com/kb/810886