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