最稳妥直接用 .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 扩展未正确标记”),或流被截断。不是代码写错,而是输入不可靠。
易优spa美容护肤网站源码是基于易优cms开发,非常适合美容院通过网络拓展业务、程序内核为Thinkphp5.0开发,后台简洁,为企业网站而生。这是一套安装就能建站的c程序,不定期更新程序BUG,更新网站功能。我们提供的不仅是模板这么简单,我们还提供程序相关咨询、协助安装等服务。默认不包含小程序插件,需要另外单独购买插件。模板安装步骤1、请将安装包ZIP上传到你的网站根目录,在线解压2、安装模板系
- 先用系统自带解压工具(如 Windows 资源管理器)打开确认是否真能读
- 捕获
InvalidDataException并提示“ZIP 文件格式异常或已损坏”,别尝试继续解析 - 避免用
File.ReadAllBytes()加载超大 ZIP 再转MemoryStream—— 容易 OOM;优先用FileStream流式处理
需要解压全部文件到指定目录?用 ExtractToDirectory
如果目标就是完整解压,.NET 提供了更简捷的 ZipFile.ExtractToDirectory,但它有隐含行为需留意:
- 目标目录必须不存在,否则抛
IOException(不会自动清空或合并) - 路径遍历风险:若 ZIP 内含
../../etc/passwd这类路径,该方法默认不做校验 —— 必须手动过滤entry.FullName中的.. - 不支持设置覆盖策略(如“跳过已存在文件”),要控制行为得自己遍历
ZipArchive+ 判断File.Exists
// 安全解压示例(防路径遍历)
foreach (var entry in archive.Entries)
{
string safePath = Path.GetFullPath(Path.Combine(outputDir, entry.FullName));
if (!safePath.StartsWith(outputDir, StringComparison.Ordinal))
throw new InvalidOperationException("Suspicious path detected");
entry.ExtractToFile(safePath, overwrite: false);
}
实际项目中,最容易被忽略的是 ZIP 文件来源不可控时的路径校验和编码处理 —— 很多线上 bug 都卡在这两步。








