Как добавить файлы в существующий zip-архив

Как добавить некоторый файл (почти всегда один CSV файл) в существующий zip файл?

Ответ 1

Поскольку вы используете .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("========================");
       }
   }
}

Ответ 2

Для создания, извлечения и открытия zip-архивов мы можем использовать ZipFile-класс с рефери: System.IO.Compress.FileSystem. Для.NET 4.5.2 и ниже нам также необходимо добавить referece: 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);
            }
        }
    }

Ответ 3

Самый простой способ - получить DotNetZip в http://dotnetzip.codeplex.com/

Добавление файлов может быть таким же простым, как

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: