3

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

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 个文件复制之间的 eclipse 时间,但由于网络速度和文件大小,很难确定 eclipse 时间。我还尝试了Find if a Copy process is in progress on Directory 中的方法,但是在复制过程中仍然可以打开令牌文件。

有什么好的方法来处理这个吗?

4

2 回答 2

2

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

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

于 2013-02-01T15:40:57.987 回答
0

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

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

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

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

于 2013-01-31T21:51:45.240 回答