关于本文
本文使用利用生成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() 的形式。即使是简短的脚本,打开外部资源后将其关闭也应该作为一套完整的流程。
