C#流式解压大ZIP文件 C#如何逐个文件读取大型ZIP包而不全部加载

小墨小哥_6695

小墨小哥_6695

2026-02-25

142人浏览

原创

正确做法是用 ZipArchive 构造函数传入未缓冲、只读的 FileStream(FileMode.Open + FileAccess.Read + FileShare.Read),指定 ZipArchiveMode.Read 且不访问 Entries 属性,改用 GetEntry 按需获取条目,并做好异常处理与资源释放。

c#流式解压大zip文件 c#如何逐个文件读取大型zip包而不全部加载

用 ZipArchive 配合 Stream 打开 ZIP,避免内存爆掉

大型 ZIP(比如几个 GB)如果用 ZipFile.ExtractToDirectory 或直接调 archive.Entries 全量加载,会把所有条目元数据一次性读进内存,还可能触发内部缓冲膨胀。正确做法是用 ZipArchive 构造函数传入一个未缓冲、只读的 FileStream,并指定 LeaveOpen = false(或手动管理生命周期)。

关键点:

  • FileStream 必须以 FileMode.Open + FileAccess.Read + FileShare.Read 打开,不能用 File.ReadAllBytes 或 MemoryStream 包裹
  • 构造 ZipArchive 时传 ZipArchiveMode.Read,且不要访问 Entries 属性——它会强制扫描整个中央目录,对超大 ZIP 可能卡住或 OOM
  • 改用 archive.GetEntry(string) 按需获取单个条目,或遍历 archive.Entries 前先确认 ZIP 不含恶意超长路径/重复条目(见下一条)

遍历条目前先做轻量校验,防止 ZIP 中央目录解析失败

某些损坏或非标准 ZIP(如分卷后拼接、加密头残留)在调 archive.Entries 时会抛 InvalidDataException 或卡死。别等 foreach 才发现——先用 ZipArchive 的底层流定位到中央目录末尾,读 4 字节签名 0x06054b50 确认结构可读;更稳妥的做法是捕获 IOException 和 InvalidDataException,并在 catch 块中 dispose archive 和 stream。

常见陷阱:

  • 没加 try/finally,导致 FileStream 或 ZipArchive 未释放,后续无法删除或重命名源 ZIP 文件
  • 误把 archive.Entries.Count 当作文件数——它实际是中央目录条目数,ZIP 允许重复名或空条目,真实有效文件需过滤 entry.Length > 0 && !entry.FullName.EndsWith("/")
  • 未处理 ZIP 中的 Unicode 路径(General Purpose Bit 11),导致 entry.FullName 出现乱码;.NET 6+ 默认支持,但旧版本需手动设置 UseUnicode = true(仅限创建,读取依赖 ZIP 自身标志)

逐个解压文件到磁盘或内存,控制缓冲区大小防卡顿

对每个 ZipArchiveEntry,调 entry.Open() 得到一个只读流,再用小缓冲区(如 8KB)复制到目标 FileStream 或 MemoryStream。别用 entry.ExtractToFile——它内部用的是 64KB 缓冲且不暴露进度,对超大单文件(如 ZIP 内含 2GB SQL 备份)容易假死。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

实操建议:

  • 解压前检查 entry.Length,跳过长度为 0 的条目(可能是目录占位符)
  • 写目标文件前确保父目录存在:Directory.CreateDirectory(Path.GetDirectoryName(fullPath))
  • 若需监控进度,用 Stream.CopyToAsync(dest, bufferSize, cancellationToken) 配合 IProgress 报告已复制字节数
  • 特别注意:ZIP 中的“目录”条目(FullName 以 / 结尾)没有 entry.Open() 流,直接 skip 即可

遇到 ZIP64 或超过 65535 个文件时的兼容性提醒

.NET 的 ZipArchive 默认支持 ZIP64(即单文件 >4GB 或总文件数 >65535),但前提是 ZIP 文件本身正确写入了 ZIP64 扩展头。如果用老旧工具生成的 ZIP 声称支持 ZIP64 却漏写扩展字段,ZipArchive 会静默截断条目列表——现象是 Entries 只返回前 65535 个,且无异常。

验证方式:

  • 用命令行 7z l -slt your.zip | findstr "ZIP64" 看是否标记 ZIP64 extra field: Yes
  • 代码中可尝试读最后一个条目:archive.Entries.LastOrDefault(),若返回 null 但 archive.Entries.Count == 65535,高度怀疑 ZIP64 兼容问题
  • 此时应换用 SharpZipLib 并启用 Zip64 = Zip64Option.Always,它对 ZIP64 边界处理更鲁棒

真正棘手的不是怎么读,而是有些 ZIP 根本没写中央目录偏移——比如流式生成中途断电,这种文件连 ZipArchive 构造都会失败,必须靠 hex editor 手动定位局部文件头再逐个解析,超出常规解压范畴。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

5023

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

1031

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1329

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

7101

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3743

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

7080

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9921

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1350

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1172

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Apache Maven 官方安装指南
Apache Maven 官方安装指南

共0课时 | 0人学习

HBuilderX Windows 安装手册
HBuilderX Windows 安装手册

共0课时 | 0人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 310人学习