【C#】Zipファイルを解凍せずに中身のファイル一覧を取得する (ZipArchive.Entries)

Zipファイルをすべて解凍する前に、「中にどんなファイルが入っているか確認したい」「特定のファイルだけが存在するかチェックしたい」という場面はよくあります。

System.IO.Compression.ZipFile.OpenRead メソッドを使用すると、ファイルを展開することなく、アーカイブ内のファイル情報(エントリ)に高速にアクセスできます。

目次

実装サンプル:ファイル名と圧縮率の表示

以下のコードでは、Zipファイルを開き、格納されているすべてのファイル名と、それぞれのファイルサイズ(圧縮前・圧縮後)を表示しています。

サンプルコード

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

public class Program
{
    public static void Main()
    {
        string zipPath = "Material.zip";

        // 1. テスト環境の準備
        // 実際にZipファイルを作っておきます
        if (File.Exists(zipPath)) File.Delete(zipPath);
        using (ZipArchive zip = ZipFile.Open(zipPath, ZipArchiveMode.Create))
        {
            // フォルダ付きのファイルと、直下のファイルを作成
            zip.CreateEntry("images/logo.png");
            zip.CreateEntry("readme.txt");
            zip.CreateEntry("src/program.cs");
        }

        Console.WriteLine($"対象ファイル: {zipPath}\n");


        // 2. Zipファイルを「読み取り専用」で開く
        // ZipFile.OpenRead は内部で File.Open(path, FileMode.Open, FileAccess.Read) などを呼んでいます
        using (ZipArchive archive = ZipFile.OpenRead(zipPath))
        {
            Console.WriteLine("--- 格納ファイル一覧 ---");

            // 3. Entries プロパティで全エントリを取得
            // archive.Entries は ReadOnlyCollection<ZipArchiveEntry> を返します
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                // FullName: フォルダ階層を含む完全なパス
                Console.WriteLine($"パス: {entry.FullName}");

                // その他の情報(サイズなど)も取得可能
                // entry.Length : 元のサイズ
                // entry.CompressedLength : 圧縮後のサイズ
                Console.WriteLine($"  - サイズ: {entry.Length} bytes (圧縮後: {entry.CompressedLength})");
            }
        }
    }
}

実行結果

対象ファイル: Material.zip

--- 格納ファイル一覧 ---
パス: images/logo.png
  - サイズ: 0 bytes (圧縮後: 0)
パス: readme.txt
  - サイズ: 0 bytes (圧縮後: 0)
パス: src/program.cs
  - サイズ: 0 bytes (圧縮後: 0)

解説と技術的なポイント

1. ZipFile.OpenRead

Zipの中身を見るだけであれば、書き込み権限の不要な ZipFile.OpenRead(または ZipFile.Open(path, ZipArchiveMode.Read))を使用するのが最も軽量で安全です。 これにより、ファイルがロックされる時間を最小限に抑え、誤ってデータを変更するリスクも排除できます。

2. ZipArchive.Entries プロパティ

アーカイブに含まれるすべてのファイル情報を ReadOnlyCollection<ZipArchiveEntry> として返します。 このコレクションを LINQ で操作することで、以下のような検索も簡単に行えます。

// 応用: 拡張子が ".png" のファイルだけを探す
var images = archive.Entries.Where(e => e.FullName.EndsWith(".png"));

3. ZipArchiveEntry の主要プロパティ

  • FullName: Zipファイル内部での相対パス(例: folder/sub/file.txt)。
  • Name: パスを含まないファイル名(例: file.txt)。
  • LastWriteTime: ファイルの更新日時。
  • Length: 解凍後のファイルサイズ。
  • CompressedLength: 圧縮状態でのファイルサイズ。

これで Zip アーカイブの基本操作(作成・追加・削除・一覧取得)は網羅できました。これらの知識を組み合わせれば、独自のバックアップツールやデプロイツールを作成することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次