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 后运行另一段代码

使用 FileSystemWatcher 监视目录

FileSystemWatcher 无法正常工作

FileSystemWatcher不会使用'mv'命令检测移动到目录中的文件,也不会在ubuntu上剪切和粘贴

c# filesystemwatcher 监控文件是不是写完

c# 中的FileSystemWatcher问题