【问题标题】:File.Delete = IOException (file still in use by other process)File.Delete = IOException(文件仍在被其他进程使用)
【发布时间】:2012-07-05 09:24:13
【问题描述】:

我的申请有点问题。对于我的应用程序,我想通过 webclient.DownloadFileAsync 下载一些文件,如果用户在下载仍在运行时退出程序,我想取消该 webclient 进程并删除该文件。

我已经使用以下代码进行了尝试,但它并不能完全正常工作,因为我总是收到 IOException(其他进程正在使用的文件)。

            for (z = 0; z < CheckedCount; z++)
        {
            MultiWebclient[z].CancelAsync();
            MultiWebclient[z].Dispose();

            dgvDownloads.Rows[z].Cells[5].Value = "Canceled";
            File.Delete(selectedFolder + _downloadRowNameList[z] + ".mp4");
        }

【问题讨论】:

  • @mydogisbox,根据异常,我猜是File.Delete调用。
  • @AndreCalil 不知怎的,我的大脑过滤掉了那部分,哈哈
  • @f4bzen,你确定 CancelAsync 完成了这个过程吗?也许 Dispose 调用并没有改变任何东西
  • @f4bzen,你试过调用 Dispose(true) 吗?查看 MSDN 上的文档:msdn.microsoft.com/en-us/library/d9yzd5cx.aspx
  • 注意CancelAsync()中的“async”这个词。这意味着它不会立即取消。您必须在完成的事件处理程序中删除该文件。

标签: c# webclient ioexception


【解决方案1】:

下载文件附有下载例程,当您尝试删除这些文件时,您会收到错误消息。您可以尝试的事情很少。

  1. 使用定时器重复检查文件句柄是否被下载例程释放,您可以在 30 秒后检查。这样您就可以在通过下载例程释放句柄后立即删除文件。

  2. 您可以存储要在用户取消操作时删除的文件的路径/文件名,并在下次应用程序启动时删除文件。

【讨论】:

    【解决方案2】:

    您的 MultiWebClient 可能仍然在流中打开文件。 Dispose 方法的真正作用是什么? 我想 Dispose 方法也有可能异步执行一些工作,并且当它到达该文件时,您的流仍然处于打开状态。 底线是某个地方有那个文件,而最大的嫌疑人就是那个 MultiWebClient。

    【讨论】:

      【解决方案3】:

      我不确定这是否是一个合法的解决方案,但我设法通过使用额外按钮取消 webclient (webclient.CancelAsync();) 并放置 File.Delete(); 来解决我的问题在将在 DownloadFileCompleted 事件中触发的 if(e.Cancelled) 语句中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2016-12-24
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 2011-03-20
        • 2014-05-26
        相关资源
        最近更新 更多