【问题标题】:Cannot access file after downloading it with Webclient使用 Webclient 下载文件后无法访问
【发布时间】:2018-01-30 23:16:05
【问题描述】:

我已使用此代码从网络服务器下载了一个 zip 文件:

client.DownloadFileAsync(url, savePath);

然后,在另一种方法中,在同一会话期间,我尝试使用此方法提取文件:

ZipFile.ExtractToDirectory(zipPath, extractDir);

这会引发错误:

System.IO.IOException: 'The process cannot access the file 
'C:\ProgramData\ZipFile.zip' because it is being used by another process.'

如果我重新启动程序然后解压缩文件(不重新下载),它会毫无问题地解压缩。

这对我来说没有多大意义,因为Webclient client 位于另一个方法中,因此应该被销毁......

除了上面提供的 2 行代码之外,没有其他方法可以访问该文件。

有没有办法释放文件?

【问题讨论】:

  • 请显示更完整的代码示例(例如,下载文件的方法、提取文件的方法、它们各自的调用方式以及 WebClient if 的任何初始化之间的真实关系任何)。
  • DownloadFile 而不是DownloadFileAsync,它解决了问题吗?如果是,则需要添加 await 关键字,并且 zip 提取仅在下载结束后发生。

标签: c# asp.net visual-studio webclient ioexception


【解决方案1】:

您需要在下载完成后提取文件,为此,您需要使用 webclient

DownloadFileCompleted 事件
private void DownloadPackageFromServer(string downloadLink)
    {
        ClearTempFolder();
        var address = new Uri(Constants.BaseUrl + downloadLink);

        using (var wc = new WebClient())
        {
            _downloadLink = downloadLink;
            wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
            wc.DownloadFileAsync(address, GetLocalFilePath(downloadLink));
            wc.Dispose();
        }
    }



 private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    { 

        UnZipDownloadedPackage(_downloadLink); 
    }

 private void UnZipDownloadedPackage(string downloadLink)
    {
        var fileName = GetLocalFilePath(downloadLink);

        ZipFile.ExtractToDirectory(fileName, Constants.TemporaryMusicFolderPath);
    }

【讨论】:

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