我有一些要下载的大型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);
}
答案 0 :(得分:2)
我开始考虑是否可以开始下载,然后在数据到达时开始解压缩,而不是等待下载完成然后开始解压缩。这可能吗?
如果要在仍下载响应正文的同时开始解压缩,则不能真的这样做。
在ZIP文件中,包含ZIP文件中文件列表的中央目录记录位于ZIP文件的末尾。这将是您下载的最后一件事。没有它,您将无法可靠地确定单个文件记录在ZIP文件中的位置。
这也可以解释为什么DotNetZip需要可搜索的流。它需要能够首先读取文件末尾的中央目录记录,然后跳回到前面的部分以读取有关单个ZIP条目的信息以提取它们。
如果您有非常具体的ZIP文件,则可以对这些单个文件记录的布局做出某些假设,并手动提取它们,而无需向后搜索,但是一般而言,它与ZIP文件并不广泛兼容。
答案 1 :(得分:0)
您可以使用异步任务解压缩
await Task.Run(() => ZipFile.ExtractToDirectory(localPath + @"\" + fileName, destinationPath));