我正在尝试使用FileSystemWatcher - 并且运气不错..
目标是将创建的文件从受监视的文件夹移动到新文件夹。
但......已经遇到了2个障碍。首先,如果我一次将3个文件移动到一个文件夹中(选择3个文件,ctrl + x,然后按ctrl + c进入我的监视文件夹),监视器只会触发第一个文件。其他2个没有得到处理。
FileSystemWatcher fsw = new FileSystemWatcher(FolderToMonitor);
fsw.Created += new FileSystemEventHandler(fsw_Created);
bool monitor = true;
while (monitor)
{
fsw.WaitForChanged(WatcherChangeTypes.All, 2000);
if (Console.KeyAvailable)
{
monitor = false;
}
}
Show("User has quit the process...", ConsoleColor.Yellow);
Console.ReadKey();
有没有办法让它看到所有3?
其次,如果我将文件从另一个驱动器移动到监视文件夹中,则需要几秒钟才能将文件复制到该文件夹中。但是,一旦文件开始复制,监视器就会触发..因此,它是只读的,不准备移动。
在处理之前,有没有办法可以等待文件复制到监视文件夹中?
答案 0 :(得分:2)
Windows操作系统通知 您的文件组件更改为 由...创建的缓冲区 FileSystemWatcher的。如果有很多 在短时间内改变缓冲区 可以溢出这导致了 组件失去对变化的追踪 目录,它只会 提供全面通知。 增加缓冲区的大小 InternalBufferSize属性是 昂贵,因为它来自非分页 无法换出的内存 磁盘,所以保持缓冲区小 足够大,不会错过任何文件 改变事件。避免缓冲 溢出,使用NotifyFilter和 IncludeSubdirectories属性如此 你可以过滤掉不需要的变化 通知。
也许这解释了你的问题?
另请注意,将文件从一个目录剪切并粘贴到另一个目录基本上只是重命名操作,因此您应该使用Renamed
事件来检测它们。
至于你的另一个问题:尝试将Changed
事件与Created
一起使用,因为我相信两个文件都会被提升一次(注意从另一个驱动器中移动文件而不是简单的重命名操作:它是复制和删除),因此Changed
事件应指示文件复制操作何时完成(即在文件完成之前不会触发)。