我正在尝试使用FileSystemWatcher --并且我有一些运气..
目标是将创建的文件从受监视的文件夹移动到新文件夹。
但是..。遇到了两个障碍。首先,如果我一次将3个文件移动到一个文件夹中(选择3个文件,选择ctrl+x,然后选择ctrl+c进入我的监视器文件夹),监视器只对第一个文件触发。另外两个不会被处理。
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个?
其次,如果我将一个文件从不同的驱动器移动到monitor文件夹,将文件复制到该文件夹需要几秒钟的时间。但是,一旦文件开始复制,监视器就会触发。因此,是只读的,而不是准备移动的。
有没有一种方法可以在我处理文件之前,等待文件完成复制到monitor文件夹?
发布于 2011-05-14 17:54:26
根据msdn documentation的说法:
Windows操作系统在FileSystemWatcher创建的缓冲区中通知您的组件文件的更改。如果在短时间内有许多更改,缓冲区可能会溢出。这会导致该组件丢失对目录中的更改的跟踪,并且它将只提供一揽子通知。使用InternalBufferSize属性增加缓冲区的大小开销很大,因为它来自不能换出到磁盘的非分页内存,因此请保持缓冲区足够小,但要足够大,以便不会错过任何文件更改事件。若要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性,以便可以筛选出不需要的更改通知。
也许这就解释了你的问题?
还要注意,从一个目录剪切并粘贴文件到另一个目录基本上只是一个重命名操作,因此您应该使用Renamed事件来检测它们。
至于你的另一个问题:尝试将Changed事件和Created事件一起使用,因为我相信这两个事件对于一个文件都只会引发一次(请注意,从另一个驱动器移动文件不是一个简单的重命名操作:它是复制和删除),所以Changed事件应该指示文件复制操作何时完成(即在文件完成之前它不会触发)。
https://stackoverflow.com/questions/6000856
复制相似问题