【C#】Zipファイルを解凍(展開)する (ZipFile.ExtractToDirectory)

Zipアーカイブ内のすべてのファイルを、指定したフォルダーにまとめて解凍するには、System.IO.Compression.ZipFile クラスの ExtractToDirectory メソッドを使用します。

このメソッドは、解凍先のフォルダーが存在しない場合に自動的に作成してくれるため、非常に手軽に利用できます。

目次

実装サンプル:アーカイブの全展開

以下のコードでは、Zipファイル(Archive.zip)を、Output という名前のフォルダーに解凍しています。

サンプルコード

using System;
using System.IO;
using System.IO.Compression; // 参照設定が必要な場合があります

public class Program
{
    public static void Main()
    {
        string zipPath = "Archive.zip";
        string extractPath = "./Output";

        // 1. テスト環境の準備
        // 解凍を試すために、ダミーのZipファイルを作成します
        if (File.Exists(zipPath)) File.Delete(zipPath);
        if (Directory.Exists(extractPath)) Directory.Delete(extractPath, recursive: true);

        // ダミーZipの作成 (メモリエントリからZip生成)
        using (var archive = ZipFile.Open(zipPath, ZipArchiveMode.Create))
        {
            var entry = archive.CreateEntry("memo.txt");
            using (var writer = new StreamWriter(entry.Open()))
            {
                writer.Write("これは解凍テスト用のファイルです。");
            }
        }
        Console.WriteLine($"Zipファイルを用意しました: {zipPath}");


        try
        {
            Console.WriteLine($"解凍先フォルダ: {extractPath}");

            // 2. Zipファイルを指定フォルダに解凍する
            // ZipFile.ExtractToDirectory(Zipファイルのパス, 解凍先のフォルダパス)
            ZipFile.ExtractToDirectory(zipPath, extractPath);

            Console.WriteLine("解凍が完了しました。");

            // (確認) 解凍されたファイルを表示
            string[] files = Directory.GetFiles(extractPath);
            foreach (var file in files)
            {
                Console.WriteLine($" - 展開ファイル: {file}");
            }
        }
        catch (IOException ex)
        {
            // 解凍先フォルダに既に同名のファイルがある場合などに発生します
            Console.WriteLine($"エラーが発生しました: {ex.Message}");
        }
    }
}

実行結果

Zipファイルを用意しました: Archive.zip
解凍先フォルダ: ./Output
解凍が完了しました。
 - 展開ファイル: ./Output\memo.txt

解説と注意点

1. ディレクトリの自動作成

ExtractToDirectory メソッドは、第2引数で指定した解凍先ディレクトリ(フォルダ)が存在しない場合、自動的に新規作成します。

2. 同名ファイルの競合

解凍先のディレクトリに、Zipファイル内と同じ名前のファイルが既に存在している場合、System.IO.IOException が発生し、処理が中断されます。デフォルトでは上書きされません。

3. 上書きして解凍したい場合 (.NET Core / .NET 5+ 以降)

新しい .NET 環境であれば、第3引数に overwrite: true を指定できるオーバーロードメソッドが用意されています。

// ファイルがあっても強制的に上書きして解凍する
ZipFile.ExtractToDirectory(zipPath, extractPath, overwrite: true);

4. 文字コードの問題

Windowsで作成されたZip(Shift-JIS)をMacやLinuxで解凍する場合や、その逆の場合、ファイル名が文字化けすることがあります。その際は、Encoding を指定できるオーバーロードを使用します。

// Shift-JIS (cp932) を指定して解凍する例
// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 必要な場合
ZipFile.ExtractToDirectory(zipPath, extractPath, Encoding.GetEncoding("Shift_JIS"
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次