如何检测文件夹是否已完成复制



在一个项目中,我有一个工作文件夹。如果我们将文件或文件文件夹从某处复制到此文件夹,我需要检测复制是否已完成。之后,我将处理此工作文件夹中的文件。

FileSystemWatcher theWatcher = new FileSystemWatcher(workingFolder);
theWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                          NotifyFilters.FileName | NotifyFilters.DirectoryName |
                          NotifyFilters.Size;
theWatcher.IncludeSubdirectories = true;
theWatcher.Created += OnFolderChanged;
theWatcher.EnableRaisingEvents = true;

每当复制文件时,都会触发 OnFolderChanged 事件。所以起初我试图获取 2 个文件复制之间的日食时间,但由于网络速度和文件大小,日食时间很难确定。我还尝试了查找目录中是否正在进行复制过程的方法,但是,在复制过程中,令牌文件仍然可以打开。

有什么好方法可以解决这个问题吗?

你不可能对一个你对FileSystemWatcher一无所知的进程的操作进行逆向工程。 有许多可能的故障模式。 一个很好的例子是用户使用资源管理器复制文件,它显示一个对话框,因为目标文件已经存在。 随着用户不上厕所,因为他指望它需要一段时间。

永远不应该对正在发生的事情做出任何假设。 任意地,在收到通知时启动一分钟计时器,并在收到另一个通知时重新启动计时器。 当计时器滴答作响时,您有理由猜测复制操作已完成。 只要确保当你猜错时它永远不会成为问题。

如果你可以控制复制文件/文件夹的进程 - 你可以在文件/文件夹完成复制后附加一个后缀 (.complete),并将文件系统观察程序设置为仅响应扩展名为 .complete 的文件/文件夹。

更新 - 由于您无法控制复制的文件/文件夹名称 - 我将在FolderChaged方法中使用异常处理。我假设您正在对该方法中的文件/文件夹进行一些处理,并且当您尝试访问未完成复制的文件/文件夹时 - 您将获得某种System.IO异常。

我在 FSW 中也遇到了这个问题,我通过捕获异常、暂停几秒钟,然后尝试再次访问该文件来处理它。我把这个逻辑放在一个循环中,该循环会在 10 秒内重试访问该文件 5 次。如果我们在 5 次尝试后仍然无法处理文件 - 我们抛出异常,我们的标准错误处理接管。

当然,对于您来说,适当的循环参数是什么仍然是一个悬而未决的问题,如果您达到这些参数的限制,您将如何处理故障?

相关内容

  • 没有找到相关文章

最新更新