FileSystemWatcher问题

时间:2011-05-14 09:09:44

标签: c# filesystemwatcher

我正在尝试使用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?

其次,如果我将文件从另一个驱动器移动到监视文件夹中,则需要几秒钟才能将文件复制到该文件夹​​中。但是,一旦文件开始复制,监视器就会触发..因此,它是只读的,不准备移动。

在处理之前,有没有办法可以等待文件复制到监视文件夹中?

1 个答案:

答案 0 :(得分:2)

根据msdn documentation

  

Windows操作系统通知   您的文件组件更改为   由...创建的缓冲区   FileSystemWatcher的。如果有很多   在短时间内改变缓冲区   可以溢出这导致了   组件失去对变化的追踪   目录,它只会   提供全面通知。   增加缓冲区的大小   InternalBufferSize属性是   昂贵,因为它来自非分页   无法换出的内存   磁盘,所以保持缓冲区小   足够大,不会错过任何文件   改变事件。避免缓冲   溢出,使用NotifyFilter和   IncludeSubdirectories属性如此   你可以过滤掉不需要的变化   通知。

也许这解释了你的问题?
另请注意,将文件从一个目录剪切并粘贴到另一个目录基本上只是重命名操作,因此您应该使用Renamed事件来检测它们。

至于你的另一个问题:尝试将Changed事件与Created一起使用,因为我相信两个文件都会被提升一次(注意从另一个驱动器中移动文件而不是简单的重命名操作:它是复制和删除),因此Changed事件应指示文件复制操作何时完成(即在文件完成之前不会触发)。