使用C#将单个文件添加到大型ZIP文件的快速方法

时间:2018-08-28 11:38:42

标签: c# zip

我有一个大的zip文件(例如10 GB),我想在其中添加一个小文件(例如50 KB)。我正在使用以下代码:

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

尽管这最终会奏效,但它会花费很长时间并且消耗大量的内存。似乎提取并重新压缩了整个存档。

如何在.Net 4.7中进行改进?没有外部依赖性的解决方案是首选,但如果不可能的话,则不需要。

3 个答案:

答案 0 :(得分:0)

使用Visual Studio nuget程序包管理器并安装

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/

答案 1 :(得分:0)

由于您处于.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

答案 2 :(得分:0)

我在另一个堆栈溢出答案:Out of memory exception while updating zip in c#.net中找到了这种现象的原因。

要点是,这需要很长时间,因为ZipArchiveMode.Update将zip文件缓存到内存中。避免这种缓存行为的建议是创建一个新的存档,然后将旧的存档内容以及新文件复制到其中。

请参见the MSDN documentation,其中介绍了ZipArchiveMode.Update的行为: