Быстрый способ добавить один файл в большой ZIP-файл с помощью C # - PullRequest
0 голосов
/ 28 августа 2018

У меня есть большой zip-файл (скажем, 10 ГБ), к которому я хочу добавить один маленький файл (скажем, 50 КБ). Я использую следующий код:

using System.IO.Compression;
using (var targetZip = ZipFile.Open(largeZipFilePath), ZipArchiveMode.Update)
{
    targetZip.CreateEntryFromFile(smallFilePath, "foobar");
}

Хотя это работает (в конце концов), это занимает очень много времени и занимает смехотворное количество памяти. Кажется, извлечь и перепаковать весь архив.

Как я могу улучшить это в .Net 4.7? Решение без внешних зависимостей предпочтительнее, но не обязательно, если невозможно.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Поскольку вы находитесь выше .NET 4.5, вы можете использовать класс ZipArchive (System.IO.Compression) для достижения этой цели. Вот документация MSDN: (MSDN).

Вот их пример, он просто пишет текст, но вы можете прочитать в файле .csv и записать его в свой новый файл. Чтобы просто скопировать файл, вы должны использовать CreateFileFromEntry, который является методом расширения для ZipArchive.

using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
{
   using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
   {
       ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
       using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
       {
           writer.WriteLine("Information about this package.");
           writer.WriteLine("========================");
       }
   }
}

Проверьте это: - https://stackoverflow.com/a/22339337/9912441

https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-compress-and-extract-files

0 голосов
/ 28 августа 2018

используйте менеджер пакетов Visual Studio Nuget и установите его

Install-Package DotNetZip -Версия 1.11.0

    using (ZipFile zip = new ZipFile())
  {
    zip.AddFile("ReadMe.txt"); // no password for this one
    zip.Password= "123456!";
    zip.AddFile("7440-N49th.png");
    zip.Password= "!Secret1";
    zip.AddFile("2005_Annual_Report.pdf");

    zip.Save("Backup.zip");
  }

https://www.nuget.org/packages/DotNetZip/

...