是否可以并行下载和解压缩?

时间:2019-07-01 02:33:36

标签: c# parallel-processing zip dotnetzip

我有一些要下载的大型zip文件,然后在程序中解压缩。性能很重要,我开始考虑的一个方向是是否有可能开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?根据我对DEFLATE的了解,理论上应该可行吗?

我目前正在使用DotNetZip作为我的zip库,但是它拒绝对不可搜索的流进行操作。

代码将如下所示:

// HTTP Get the application from the server
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
request.Method = "GET";

Directory.CreateDirectory(localPath);
using (var response = (HttpWebResponse)request.GetResponse())
using (Stream input = response.GetResponseStream())
{
    // Unzip being some function which will start unzipping and
    // return when unzipping is done
    return Unzip(input, localPath);
}

2 个答案:

答案 0 :(得分:2)

  

我开始考虑是否可以开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?

如果要在仍下载响应正文的同时开始解压缩,则不能真的这样做。

在ZIP文件中,包含ZIP文件中文件列表的中央目录记录位于ZIP文件的末尾。这将是您下载的最后一件事。没有它,您将无法可靠地确定单个文件记录在ZIP文件中的位置。

这也可以解释为什么DotNetZip需要可搜索的流。它需要能够首先读取文件末尾的中央目录记录,然后跳回到前面的部分以读取有关单个ZIP条目的信息以提取它们。

如果您有非常具体的ZIP文件,则可以对这些单个文件记录的布局做出某些假设,并手动提取它们,而无需向后搜索,但是一般而言,它与ZIP文件并不广泛兼容。

答案 1 :(得分:0)

您可以使用异步任务解压缩

await Task.Run(() => ZipFile.ExtractToDirectory(localPath + @"\" + fileName, destinationPath));