最稳妥直接用 .NET 内置 System.IO.Compression.ZipArchive 类,需以 ZipArchiveMode.Read 打开并用 using 确保释放;不支持密码,读取文本需指定编码,解压需防路径遍历。
用 ZipArchive 读取 ZIP 包内容最稳妥
直接用 .NET 内置的 System.IO.Compression.ZipArchive 类,无需第三方库,兼容 .NET Framework 4.5+ 和 .NET Core / .NET 5+。它不负责解压到磁盘,而是让你逐个访问条目(ZipArchiveEntry),适合只读取、检查或选择性提取。
- 必须以
ZipArchiveMode.Read打开,否则会报System.IO.InvalidOperationException: Stream was not readable - 流不能被其他代码提前关闭或释放;推荐用
using确保资源释放 - 如果 ZIP 文件带密码,
ZipArchive原生不支持 —— 此时必须换SharpZipLib或DotNetZip
using (var stream = File.OpenRead("archive.zip"))
using (var archive = new ZipArchive(stream, ZipArchiveMode.Read))
{
foreach (var entry in archive.Entries)
{
Console.WriteLine($"{entry.FullName} ({entry.Length} bytes)");
// 可调用 entry.Open() 读取其内容流
}
}
读取某个具体文件的内容(不落地)
想跳过解压到硬盘、直接拿到某文件的字节或文本?关键在 ZipArchiveEntry.Open() 返回一个可读流,再配合 StreamReader 或 MemoryStream 处理。
- 注意:
entry.Length是压缩前大小,entry.CompressedLength是压缩后大小,别混淆 - 若 entry 是空目录(
FullName以/结尾),Open()会抛NotSupportedException - 文本文件建议指定编码(如 UTF-8),否则可能乱码;二进制文件直接读
byte[]
var entry = archive.GetEntry("config.json");
if (entry != null)
{
using var entryStream = entry.Open();
using var reader = new StreamReader(entryStream, Encoding.UTF8);
string content = reader.ReadToEnd(); // 或用 ReadAllBytes()
}
遇到 InvalidDataException 怎么办
常见于 ZIP 文件损坏、非标准格式(比如某些工具生成的“ZIP64 扩展未正确标记”),或流被截断。不是代码写错,而是输入不可靠。