就是这样,每次将文件复制到 FileWatcher 文件夹时,FileSystemWatcher 都会生成3 个事件
示例:当使用File.Copy (source, watcherFolder ,真的)。
复制不同大小的文件(1kb、67kb、100MB、500MB、1 GB 文件)时收到 3 个事件。我已经在 FileSystemWatcher 中注册了 Created and Changed 事件
就是这样,每次将文件复制到 FileWatcher 文件夹时,FileSystemWatcher 都会生成3 个事件
示例:当使用File.Copy (source, watcherFolder ,真的)。
复制不同大小的文件(1kb、67kb、100MB、500MB、1 GB 文件)时收到 3 个事件。我已经在 FileSystemWatcher 中注册了 Created and Changed 事件
如果您的问题是关于您收到的多个事件,这是正常行为。文件复制可以引发多个事件。
您可以检查FileSystemEventArgs.ChangeType中的更改并忽略某些事件。这是WatcherChangeTypes 枚举。
看看FileSystemWatcher备注。
关于Created事件,它将在目标文件夹中引发。
例如,您创建两个 FileSystemWatcher 实例。FileSystemWatcher1 设置为监视“C:\My Documents”,FileSystemWatcher2 设置为监视“C:\Your Documents”。如果将文件从“我的文档”复制到“您的文档”,FileSystemWatcher2 将引发 Created 事件,但不会为 FileSystemWatcher1 引发任何事件。与复制不同,移动文件或目录会引发两个事件。在前面的示例中,如果您将文件从“我的文档”移动到“您的文档”,FileSystemWatcher2 将引发 Created 事件,FileSystemWatcher1 将引发 Deleted 事件。
如评论中所述,您应该查找正在创建的文件,然后尝试文件锁定以确定它是否已完全复制。
while ($true)
{
try{
[IO.file]::openwrite("<insert file path>").close()
break
}
catch { start-sleep -Seconds 60 }
}
如果您可以控制文件复制操作,那么简单的做法是使用临时名称创建文件,并在复制后重命名。让我们FileSystemWatcher
关注Rename
事件。此事件仅触发一次。