【问题标题】:How do I add files to an existing zip archive如何将文件添加到现有的 zip 存档
【发布时间】:2014-04-15 20:43:54
【问题描述】:

如何将一些文件(几乎总是一个 .csv 文件)添加到现有的 zip 文件中?

【问题讨论】:

标签: c# zipfile


【解决方案1】:

对于创建、提取和打开 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)。谢谢。
  • @FeiyuZhou,你能建议如何添加一个文件夹,然后是文件吗?
  • @BinoyCherian你可以修改foreach中的代码,使用CreateEntryFromFolder方法支持文件夹
  • 终于有一些关于 ZipFile 的准确、完整的信息了!谢谢。
  • 不要混淆,如果您在 ZipFile 类的文档中找不到 CreateEntryFromFile。此方法和另外两个有用的方法(ExtractToDirectoryExtractToFile)被定义为 ZipFileExtensions 类中的扩展方法。
【解决方案2】:

最简单的方法是通过 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 已关闭。旧档案仍然 [可在 Codeplex 获得][1]。看起来代码已经迁移到Github了:


【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 伙计,太快了!我会试一试,看看会发生什么。谢谢你这么快发帖!如果/何时我成功了,我会告诉你的。尼克
    • 您会感到惊讶,我已经在帖子的 30 秒到一分钟内看到了答案(当然是为了方便回答问题)。
    • 我正在尝试您的建议,Takkera 勋爵,但我看到了一个“障碍”。我正在使用以下内容:使用系统;使用 System.Collections.Generic;使用 System.Linq;使用 System.Text;使用 System.Threading.Tasks;使用 System.IO;使用 System.IO.Compression;使用 System.Diagnostics; “ZipArchive”有一条红色下划线。
    • @MikeDymond 您将使用CreateEntryFromFile 方法:msdn.microsoft.com/en-us/library/hh485720(v=vs.110).aspx 如果您想发布新问题,我很乐意提供代码示例。我不觉得这个用例对 this 问题很重要。
    • 另外,请查看 ZipFileExtensions.CreateEntryFromFile
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多