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

Is it possible to download and unzip in parallel?

我正在下载一些大的 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);
}

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

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

I started thinking about was whether it was possible to start the download and then begin unzipping the data as it arrives, instead of waiting for the download to complete and then start unzipping. Is this possible?

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

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

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

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