Можно ли параллельно скачивать и разархивировать? - PullRequest
1 голос
/ 01 июля 2019

У меня есть несколько больших 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 ]

2 голосов
/ 01 июля 2019

Я начал думать о том, можно ли начать загрузку, а затем начать разархивировать данные по мере их поступления, вместо того, чтобы ждать завершения загрузки и затем начать разархивирование.Возможно ли это?

Если вы хотите начать разархивирование во время загрузки тела ответа, вы не можете действительно сделать это.

В ZIP-архивеФайл, запись центрального каталога, который содержит список файлов в ZIP-файле, находится в самом конце ZIP-файла.Это будет последнее, что вы скачаете.Без этого вы не сможете надежно определить, где отдельные записи файла находятся в вашем ZIP-файле.

Это также объясняет, почему DotNetZip нужен поток для поиска.Необходимо сначала иметь возможность прочитать запись Центрального каталога в конце файла, а затем вернуться к предыдущим разделам, чтобы прочитать информацию об отдельных записях ZIP и извлечь их.

Если у вас есть очень специфичные файлы ZIP, выможет сделать определенные предположения о расположении этих отдельных файловых записей и извлечь их вручную, не обращаясь назад, но в целом он не будет совместим с ZIP-файлами.

0 голосов
/ 01 июля 2019

Вы можете использовать асинхронную задачу, чтобы распаковать

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