我正在使用.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);
}
有什么想法吗?
答案 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)
无论如何 - 这个问题一直困扰着我们 - 幸运的是我们的存储供应商非常友好地解决了这个问题。
在这里看看,看看这是否可以帮助你克服魔法50 ......