FileSystemWatcher - 文件复制期间的 3 个事件
Posted
技术标签:
【中文标题】FileSystemWatcher - 文件复制期间的 3 个事件【英文标题】:FileSystemWatcher - 3 events during File copy 【发布时间】: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 事件。如果这不是您想要的,请提供更多详细信息。 【参考方案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
事件。此事件仅触发一次。
【讨论】:
以上是关于FileSystemWatcher - 文件复制期间的 3 个事件的主要内容,如果未能解决你的问题,请参考以下文章
FileSystemWatcher不会使用'mv'命令检测移动到目录中的文件,也不会在ubuntu上剪切和粘贴