Загружает ли ZipArchive весь zip-файл в память - PullRequest
1 голос
/ 04 августа 2020
• 1000

1 Ответ

2 голосов
/ 04 августа 2020

Это зависит от того, как был создан fileStream. Он был создан из файла на диске? Если да, то ZipArchive будет читать с диска по мере необходимости. Он не будет помещать все в память, а затем читать. Это было бы невероятно неэффективно.

У меня большой опыт в этом ... Я работал над проектом, в котором мне пришлось разархивировать 25 ГБ. ZIP-файлы. . NET s ZipArchive был очень быстрым и очень эффективным с точки зрения памяти.

Вы можете иметь MemoryStream s, которые содержат данные, из которых ZipArchive может читать, поэтому вы не ограничены только Zip файлы на диске.

Вот несколько эффективный способ распаковать ZipArchive:

var di = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDirectoryToExtractTo"));

var filesToExtract = _zip.Entries.Where(x =>
                                        !string.IsNullOrEmpty(x.Name) &&
                                        !x.FullName.EndsWith("/", StringComparison.Ordinal));

foreach(var x in filesToExtract)
{
    var fi = new FileInfo(Path.Combine(di.FullName, x.FullName));
    
    if (!fi.Directory.Exists) { fi.Directory.Create(); }
    
    using (var i = x.Open())
    using (var o = fi.OpenWrite())
    {
        i.CopyTo(o);
    }
}

Это распакует все файлы в C:\ProgramData\MyDirectoryToExtractTo\ с сохранением структуры каталогов.

Если вы хотите увидеть, как ZipArchive был реализован для проверки, возьмите , посмотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...