サーチ…


前書き

ZipFileクラスは、 System.IO.Compression名前空間に存在します。これは、Zipファイルの読み書きに使用できます。

備考

  • FileStreamの代わりにMemoryStreamを使用することもできます。

  • 例外

例外調子
ArgumentException ストリームがすでに閉じられているか、またはストリームの機能がモードに一致していません(たとえば、読み取り専用ストリームに書き込もうとしています)
ArgumentNullException 入力ストリームがnull
ArgumentOutOfRangeException モードの値が無効です
InvalidDataException 下のリストを参照

InvalidDataExceptionがスローされると、3つの原因があります。

  • ストリームの内容をzipアーカイブとして解釈できませんでした
  • モードが更新され、エントリがアーカイブにないか、破損して読み込めません
  • モードがUpdateであり、エントリが大きすぎてメモリに収まらない

すべての情報はこのMSDNページから取得されています

ZIPコンテンツのリスト

このスニペットには、zipアーカイブのすべてのファイル名がリストされます。ファイル名はジップルートを基準にしています。

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    for (int i = 0; i < archive.Entries.Count; i++)
    {
        Console.WriteLine($"{i}: {archive.Entries[i]}");
    }
}

ZIPファイルからのファイルの抽出

すべてのファイルをディレクトリに展開するのはとても簡単です:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}

ファイルがすでに存在する場合は、 System.IO.IOExceptionがスローされます。

特定のファイルを抽出する:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    // Get a root entry file
    archive.GetEntry("test.txt").ExtractToFile("test_extracted_getentries.txt", true);

    // Enter a path if you want to extract files from a subdirectory
    archive.GetEntry("sub/subtest.txt").ExtractToFile("test_sub.txt", true);

    // You can also use the Entries property to find files
    archive.Entries.FirstOrDefault(f => f.Name == "test.txt")?.ExtractToFile("test_extracted_linq.txt", true);

    // This will throw a System.ArgumentNullException because the file cannot be found
    archive.GetEntry("nonexistingfile.txt").ExtractToFile("fail.txt", true);
}

これらのメソッドのいずれも同じ結果を生成します。

ZIPファイルの更新

ZIPファイルを更新するには、そのファイルをZipArchiveMode.Updateで開く必要があります。

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
{
    // Add file to root
    archive.CreateEntryFromFile("test.txt", "test.txt");

    // Add file to subfolder
    archive.CreateEntryFromFile("test.txt", "symbols/test.txt");
}

また、アーカイブ内のファイルに直接書き込むこともできます。

var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
    writer.WriteLine("Test line");
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow