【问题标题】:FileSystemWatcher - 3 events during File copyFileSystemWatcher - 文件复制期间的 3 个事件
【发布时间】:2012-08-28 22:31:10
【问题描述】:

就是这样,每次将文件复制到FileWatcher文件夹时,FileSystemWatcher都会产生3个事件

示例:正在 Created -> Changed -> Changed(在新文件期间)或 Changed -> Changed -> Changed(在覆盖现有文件期间)事件,当使用 File.Copy(source,watcherFolder,true) 将文件复制到 FileWatcher 文件夹时。

在复制不同大小的文件(1kb、67kb、100MB、500MB、1 GB 文件)时收到 3 个事件。我已经在 FileSystemWatcher 中注册了 Created and Changed 事件

【问题讨论】:

  • 是的,FileSystemWatcher 会告诉您特定的文件写入作为 Changed 事件。如果这不是您想要的,请提供更多详细信息。

标签: c# filesystemwatcher .net


【解决方案1】:

如果您的问题是关于您收到的多个事件,这是正常行为。文件复制可以引发多个事件。

您可以检查FileSystemEventArgs.ChangeType 中的更改并忽略某些事件。这是WatcherChangeTypes Enumeration

看看FileSystemWatcher备注。

关于Created 事件,将在目标文件夹中引发。

例如,您创建了两个 FileSystemWatcher 实例。 FileSystemWatcher1 设置为监视“C:\My Documents”,FileSystemWatcher2 设置为监视“C:\Your Documents”。如果将文件从“我的文档”复制到“您的文档”,FileSystemWatcher2 将引发 Created 事件,但不会为 FileSystemWatcher1 引发任何事件。与复制不同,移动文件或目录会引发两个事件。在前面的示例中,如果您将文件从“我的文档”移动到“您的文档”,FileSystemWatcher2 将引发 Created 事件,FileSystemWatcher1 将引发 Deleted 事件。

【讨论】:

  • 当一个文件被复制到文件监视文件夹时,如何识别文件是否完全复制到文件监视文件夹?
  • 编辑了我的答案:您必须在目标文件夹(即文件复制到的目录)上观看 Created 事件。
  • @Snober 测试文件是否被锁定 - 如果你不知道我如何发布代码。但不在评论中
【解决方案2】:

如 cmets 中所述,您应该查找正在创建的文件,然后尝试文件锁定以确定它是否已完全复制。

    while ($true)
    {
        try{ 
            [IO.file]::openwrite("<insert file path>").close()
            break
        }
        catch { start-sleep -Seconds 60 }
    }

【讨论】:

    【解决方案3】:

    如果您可以控制文件复制操作,那么简单的做法是使用临时名称创建文件,并在复制后重命名。让FileSystemWatcher 关注Rename 事件。此事件仅触发一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-14
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多