1

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

示例:当使用File.Copy (source, watcherFolder ,真的)。

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

4

3 回答 3

2

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

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

看看FileSystemWatcher备注。

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

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

于 2012-09-04T13:26:16.930 回答
1

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

    while ($true)
    {
        try{ 
            [IO.file]::openwrite("<insert file path>").close()
            break
        }
        catch { start-sleep -Seconds 60 }
    }
于 2014-03-08T20:36:25.100 回答
0

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

于 2014-03-08T20:49:29.977 回答