C#解压zip文件 C#如何读取zip压缩包内容

来源:这里教程网 时间:2026-02-21 17:41:16 作者:

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 扩展未正确标记”),或流被截断。不是代码写错,而是输入不可靠。

先用系统自带解压工具(如 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 都卡在这两步。

相关推荐