讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋瑶小哥_7363

秋瑶小哥_7363

发布时间:2026-02-07 07:39:35

|

1052人浏览过

|

来源于php中文网

原创

最稳妥直接用 .NET 内置 System.IO.Compression.ZipArchive 类,需以 ZipArchiveMode.Read 打开并用 using 确保释放;不支持密码,读取文本需指定编码,解压需防路径遍历。

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

用 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 处理。

Node.js 可靠编程
Node.js 可靠编程

Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。

下载
  • 注意: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 都卡在这两步。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1967

2023.09.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3419

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2978

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1528

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2699

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3350

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1717

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2537

2023.08.28

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn