在一个项目中,我有一个工作文件夹。如果我们将文件或文件夹从某处复制到此文件夹,我需要检测复制是否已完成。之后我会处理这个工作文件夹中的文件。
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事件。所以起初我试图在两次文件复制之间获得日食时间,但是由于网络速度和文件大小,日食时间很难确定。我也试过Find if a Copy process is in progress on Directory中的方法, 但是在复制过程中仍然可以打开令牌文件。
有什么好方法可以解决这个问题吗?
答案 0 :(得分:2)
您无法对使用FileSystemWatcher一无所知的进程进行逆向工程。有许多可能的故障模式。一个很好的例子是用户使用资源管理器复制文件并显示对话框,因为目标文件已经存在。随着用户休息,因为他指望它需要一段时间。
你应该从不对正在发生的事情作出任何假设。任意地,当你收到通知时启动一分钟计时器,当你得到另一个通知时重新启动它。当计时器滴答时,您有某些的理由猜测复制操作已完成。只要确保在猜错时它永远不会成为问题。
答案 1 :(得分:0)
如果您可以控制复制文件/文件夹的进程 - 您可以在完成复制时将后缀(.complete)附加到文件/文件夹,并将文件系统观察程序设置为仅响应文件/具有.complete扩展名的文件夹。
更新 - 由于您无法控制复制的文件/文件夹名称 - 我会在FolderChaged
方法中使用异常处理。我假设您正在使用该方法中的文件/文件夹进行一些处理,并且当您尝试访问未完成复制的文件/文件夹时,您将获得某种System.IO
异常。
我也遇到了FSW这个问题,我通过捕获异常处理它,暂停几秒钟,然后再次尝试访问该文件。我将这个逻辑放在一个循环中,该循环将在10秒内重试访问该文件5次。如果我们仍然无法在5次尝试后处理该文件 - 我们抛出异常并且我们的标准错误处理将接管。
当然,对于你来说,适当的循环参数是一个悬而未决的问题,如果达到这些参数的极限,你如何处理失败?