web-dev-qa-db-ja.com

既存のZipアーカイブにファイルを追加する方法

既存のZipファイルにファイル(ほとんどの場合、単一の.csvファイル)を追加するにはどうすればよいですか?

18
user3408397

.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("========================");
       }
   }
}
27
BradleyDotNET

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);
            }
        }
    }
17
Feiyu Zhou

最も簡単な方法は、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();
}

Edited To Note:DotNetZipは、Codeplexに住んでいたものです。 Codeplexはシャットダウンされました。古いアーカイブはまだ[Codeplexで入手可能] [1]です。コードがGithubに移行したようです:


7
Nicholas Carey