【问题标题】:FileSystemWatcher OnCreated only firing for first file of multiple files copiedFileSystemWatcher OnCreated 仅针对复制的多个文件的第一个文件触发
【发布时间】:2012-09-19 12:09:37
【问题描述】:

我有一个FileSystemWatcher,我想为复制到监视目录的每个文件夹触发一个OnCreated event。将手动将多个文件夹一次复制到此监视目录中。

目前它只为复制的第一个文件夹触发event
因此,如果我正在查看文件夹 X 并在 Windows 资源管理器中选择文件夹 A、B、C 并将它们复制到 X 中,OnCreated 会为 A 而不是 B 或 C 触发。

这是我用来设置FileSystemWatcher的代码:

watcher = new System.IO.FileSystemWatcher(watchPath);            
watcher.InternalBufferSize = 32768;
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | 
                       NotifyFilters.CreationTime | NotifyFilters.LastWrite;


watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.EnableRaisingEvents = true;

这是我的OnCeated 方法

void OnCeated(object sender, FileSystemEventArgs e)
{            
    XDocument xmlDoc = BeginImport(e.FullPath); 
}

知道为什么这只会触发复制到监视目录中的第一个文件夹的事件

【问题讨论】:

    标签: c# .net filesystemwatcher


    【解决方案1】:

    来自the documentation

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

    这似乎是一个内部限制。

    我相信一次粘贴所有三个文件夹的行为被认为是“在短时间内进行了许多更改”——你可以使用 NotifyFilter 并省略一些事件吗?

    【讨论】:

    • +1 @ELG 可能会跟踪最后处理文件的日期,然后处理日期为 gt 的任何文件。
    • 就是这样,谢谢!我将缓冲区设置为允许的最大值 (64k),关闭包含子目录,并仅过滤 CreationTime 和 DirectoryName,它一次处理至少 50 个目录。
    • 创建自己的缓冲区也很有帮助;有一个并发队列,您可以在收到通知时添加到该队列中,然后稍后再对该队列采取行动。只要您希望基于文件更改完成的工作比将代表它的对象添加到队列中的工作花费更长的时间(这种情况很常见),这就会降低丢失文件更改的可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多