この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。.NETのZipFile.OpenReadとZipArchiveEntryの公式APIを確認し、ZIPを展開せず内容を確認するPowerShell TIPSとして整理しています。検証ステータス:📘 .NET公式API確認済み・サンプル実装済み・PowerShell実機確認は未実施
ZIPを解凍せず中身を確認する ― PowerShellから.NETのZipFileを直接使う
ZIPの内容を確認したいだけなら、毎回展開する必要はありません。PowerShellから .NET の System.IO.Compression.ZipFile.OpenRead() を使うと、ZIPを読み取り用に開き、各entryの名前やサイズを一覧できます。
最小例
$path = (Resolve-Path -LiteralPath ".\sample.zip").Path
# ZIPを読み取り専用として開きます。ここでは展開しません。
$archive = [System.IO.Compression.ZipFile]::OpenRead($path)
try {
$archive.Entries | Select-Object FullName, Length, CompressedLength
}
finally {
# ファイルを掴んだままにしないよう、必ず閉じます。
$archive.Dispose()
}
Entries はZIP内部のentry一覧です。各entryから、元のサイズを表す Length、圧縮後サイズを表す CompressedLength などを取得できます。
「解凍しない」とは何をしているのか
flowchart LR
A[ZIPファイル] --> B[ZipFile.OpenRead]
B --> C[ZipArchive]
C --> D[Entries]
D --> E[ファイル名]
D --> F[元サイズ Length]
D --> G[圧縮サイズ CompressedLength]
この処理はentryの一覧やメタデータを読むもので、各ファイルを保存先へ展開する処理ではありません。そのため、「どんなファイルが入っているか」「想定外に巨大なentryがないか」を展開前に見る用途に向きます。
ただし、ZIPを読むだけで未知のファイルが安全になるわけではありません。 信頼できないアーカイブを後で展開・実行する場合は、パスやファイル内容など別の安全確認が必要です。
完全版では集計も出す
GitHub版ではentryごとに次を表示します。
Name: ZIP内部のパスSize: 元サイズCompressedSize: 圧縮後サイズLastWriteTime: entryに記録された更新日時IsDirectory: ディレクトリentryか
さらにファイル数、元サイズ合計、圧縮サイズ合計も出します。
この方法なら、たとえば「ZIPを受け取ったが、中身を展開する前に容量とファイル構成だけ見たい」という確認作業を短くできます。
Disposeを省かない
OpenRead() で開いた ZipArchive はファイルを保持します。後始末をしないまま別処理でZIPを移動・上書きしようとすると、環境によってはファイル使用中の原因になります。
そのため、エラーが途中で起きても finally で Dispose() する形にしています。短いスクリプトでも、外部リソースを開いたら閉じるところまでを1セットにします。
