如何向已存在的zip压缩包中添加文件

31

我怎样能将一个文件(几乎总是单个的 .csv 文件)添加到一个已存在的 zip 文件中?


这个问题与SharpZipLib无关,所以我已经重新打开了它。 - BradleyDotNET
可能是将文件添加到现有的Zip压缩包的重复问题。 - Deantwo
3个回答

36

如果您使用的是.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("========================");
       }
   }
}

太快了!我会试一下看看会发生什么。谢谢你这么快就发布了!如果我成功了,我会告诉你的。尼克 - user3408397
1
你会感到惊讶的,我曾经看到过在发布后30秒到1分钟内就有答案的情况(当然是对于容易回答的问题)。 - BradleyDotNET
我正在尝试您的建议,Takkera大人,但是我遇到了一个“问题”。我正在使用以下代码:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.IO.Compression; using System.Diagnostics; “ZipArchive”有一个红色的下划线。 - user3408397
1
@MikeDymond 你可以使用 CreateEntryFromFile 方法:http://msdn.microsoft.com/zh-cn/library/hh485720(v=vs.110).aspx 如果你想要发表一个新问题,我很乐意提供代码示例。我觉得这个用例对于这个问题并不是非常重要。 - BradleyDotNET
1
另外,请查看ZipFileExtensions.CreateEntryFromFile。 - Guy L
显示剩余4条评论

34

要创建、提取和打开zip归档文件,我们可以使用ZipFile Class,参考:System.IO.Compression.FileSystem。对于.NET 4.5.2及以下版本,我们还需要添加参考:System.IO.Compression。这是将文件添加到zip的方法:

    public static void AddFilesToZip(string zipPath, string[] files)
    {
        if (files == null || files.Length == 0)
        {
            return;
        }

        using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
        {
            foreach (var file in files)
            {
                var fileInfo = new FileInfo(file);
                zipArchive.CreateEntryFromFile(fileInfo.FullName,  fileInfo.Name);
            }
        }
    }

谢谢您的回答,我同意这个答案更加简洁和整洁。不过,一开始我有些困难,直到我意识到这个答案需要引用 System.IO.Compression.Filesystem(而不仅仅是 System.IO.Compression)。谢谢。 - Rask
@FeiyuZhou,你能建议一下如何添加一个文件夹和其中的文件吗? - Binoy Cherian
@BinoyCherian,您可以通过使用CreateEntryFromFolder方法来修改foreach中的代码以支持文件夹。 - Feiyu Zhou
终于有关于ZipFile的准确、完整信息了!谢谢。 - Steve
不要困惑,如果您在 ZipFile 类的文档中找不到 CreateEntryFromFile 方法。这个方法和其他两个有用的方法 (ExtractToDirectoryExtractToFile) 被定义为扩展方法,即在 ZipFileExtensions 类中定义。 - pholpar
为了让像CreateEntryFromFolder这样的东西正常工作,我们需要在这里添加Val的扩展类。它实现了一个CreateEntryFromDirectory方法,并且可以很好地递归工作。 - TaW

7
最简单的方法是在http://dotnetzip.codeplex.com/获取DotNetZip。
添加文件可以非常简单,只需要:
String[] filenames = { @"ReadMe.txt",
                       @"c:\data\collection.csv" ,
                       @"c:\reports\AnnualSummary.pdf"
                     } ;
using ( ZipFile zip = new ZipFile() )
{
  zip.AddFiles(filenames);
  zip.Save("Archive.zip");
}

其他类型的更新同样微不足道:

using (ZipFile zip = ZipFile.Read("ExistingArchive.zip"))
{

  // update an existing item in the zip file
  zip.UpdateItem("Portfolio.doc"); 

  // remove an item from the zip file
  zip["OldData.txt"].RemoveEntry();

  // rename an item in the zip file
  zip["Internationalization.doc"].FileName = "i18n.doc";

  // add a comment to the archive
  zip.Comment = "This zip archive was updated " + System.DateTime.ToString("G");

  zip.Save();
}
编辑说明: DotNetZip曾经在Codeplex上托管,但现在已被关闭。旧的归档仍然[可在Codeplex上获得][1]。看起来代码已经迁移到了Github:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接