【问题标题】:How to force FileSystemWatcher to wait till the file downloaded?如何强制 FileSystemWatcher 等到文件下载?
【发布时间】:2011-03-09 04:57:41
【问题描述】:

我正在下载一个文件,并希望仅在下载完成后执行安装。我该如何做到这一点?似乎 FileSystemWatcher onCreate 事件会这样做,但这发生在不同的线程中,有没有一种简单的方法可以强制等待部分发生在同一个线程中。

到目前为止我的代码

 FileSystemWatcher w = new FileSystemWatcher(@"C:/downloads");
 w.EnableRaisingEvents = true;
 w.Created += new FileSystemEventHandler(FileDownloaded);

 static void FileDownloaded(object source, FileSystemEventArgs e)
 {
    InstallMSI(e.FullPath);
 }

我查看了 SynchronizingObject 和 WaitForChangedResult,但没有得到可靠的工作示例。

【问题讨论】:

  • 你是如何下载文件的?示例代码很好。
  • 正在 UI 中进行下载。该代码会使这个问题变得混乱。只能说在触发这段代码的时候,下载动作已经开始了
  • FileSystemWatcher Work is Done? 的可能重复项
  • 文件系统监视器监视目录或目录中的文件的变化,当您完成文件的更改时它不会被监视。下载完成后必须处理您的下载代码。

标签: c# multithreading filesystemwatcher


【解决方案1】:

试试:

FileInfo fInfo = new FileInfo(e.FullPath); 
while(IsFileLocked(fInfo)){
     Thread.Sleep(500);     
}
InstallMSI(e.FullPath);


static bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;
    try {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException) {
        return true;
    }
    finally {
        if (stream != null)
            stream.Close();
    }   
    return false;
}

【讨论】:

  • 这是最直接的解决方案,但我不想在我的代码中使用更多 thread.sleeps。所以我使用了另一种方法
  • 我正在编写一个控制台应用程序,并且效果很好。因为我只有一个线程,所以我正在使用它。 +1。
  • 也许添加一个检查文件是否存在?
【解决方案2】:

如果您坚持使用FileSystemWatcher,您可能不得不考虑这样一个事实,即在一次操作中不会创建(上传)某个大小的文件。在文件准备好使用之前,文件系统可能会产生 1 个created 和 x 个changed 事件。

您可以捕获created 事件并创建新的(专用)线程(除非您已经有该文件的持续线程),您可以在其中循环并定期尝试以独占方式打开文件。如果你成功了,文件就准备好了。

【讨论】:

  • 这绝对是真的。我一直将它用于一个简单的 sFTP 传输程序,甚至从根目录复制到测试目录的 17k 文件也产生了 1 个创建事件和 4 个更改事件。
【解决方案3】:

一种方法是下载到临时目录,然后在完成后将其移动到 C:/downloads。

【讨论】:

  • 我如何知道下载是否完成,即何时触发移动?
  • 取决于您如何下载它。代码是什么样的?
  • 下载完成后执行 x。那么问题来了!
【解决方案4】:

如果您使用WebClient下载,可以使用设置客户端的DownloadFileCompleted事件处理程序。
如果您这样做,您还可以使用client.DownloadFileAsync() 使其异步下载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2011-09-25
    • 2011-11-08
    • 2012-11-20
    相关资源
    最近更新 更多