C# 如何将文件添加到现有的zip存档

C# 如何将文件添加到现有的zip存档,c#,zipfile,C#,Zipfile,如何将一些文件(几乎总是一个.csv文件)添加到现有的zip文件中?由于您使用的是.NET 4.5,因此可以使用ZipArchive(System.IO.Compression)类来实现这一点。以下是MSDN文档:() 这是他们的示例,它只写文本,但您可以读入.csv文件并将其写入新文件。要仅在中复制文件,可以使用CreateFileFromEntry,这是ZipArchive的扩展方法 using (FileStream zipToOpen = new FileStream(@"c:\user

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

由于您使用的是.NET 4.5,因此可以使用ZipArchive(System.IO.Compression)类来实现这一点。以下是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("========================");
       }
   }
}

最简单的方法是在

添加文件可以非常简单

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:

  • 。看起来是原作者的回购协议
  • 。这看起来是当前维护的版本。它还打包了一个可通过Nuget在


对于创建、提取和打开zip存档,我们可以参考: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);
            }
        }
    }

老兄,太快了!我试试看会发生什么。谢谢你这么快就发帖了!我会让你知道我是否/何时能成功。NickYou会感到惊讶的,我在帖子发布后30秒到一分钟内就看到了答案(当然是简单的回答问题)。我正在尝试你的建议Takkera勋爵,但我看到了一个“障碍”。我正在使用以下工具:使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Threading.Tasks;使用System.IO;使用系统IO压缩;使用系统诊断;“ZipArchive”有一条红色下划线。
ZipArchive
类为。请确保您有一个对System.IO.Compression的项目引用,并且您正在使用.NET 4.5(因为您在VS 2012上,所以应该这样做)。这个问题不是特定于sharpziplib的,所以我重新打开了它。可能是重复的谢谢你的回答,我同意它更干净整洁。然而,我开始有点挣扎,直到我意识到这个答案需要一个参考System.IO.Compression.Filesystem(不仅仅是System.IO.Compression)。谢谢。@FeiyuZhou,你能建议如何添加文件夹和文件吗。@BinoyCherian你可以使用
CreateEntryFromFolder
方法修改
foreach
中的代码以支持文件夹。最后,关于ZipFile的一些准确、完整的信息!谢谢