0

0

C# 文件压缩解压方法 C#如何使用ZipArchive进行压缩

月夜之吻

月夜之吻

发布时间:2026-02-17 06:07:31

|

544人浏览过

|

来源于php中文网

原创

ziparchive 压缩文件打不开主因是未正确释放流导致中央目录未写入;添加文件需用 filemode.open + readwrite 配 update 模式;解压须校验路径防遍历;其不支持 zip64、加密和分卷,生产环境需补足短板。

c# 文件压缩解压方法 c#如何使用ziparchive进行压缩

ZipArchive 压缩文件时为什么生成的 zip 打不开?

常见原因是未正确调用 Dispose() 或未关闭流,导致 zip 文件头不完整。.NET 的 ZipArchive 依赖流的最终刷新和关闭来写入中央目录结构——如果流提前释放或未显式关闭,压缩包看似生成成功,但双击打开会提示“无法读取”或“文件损坏”。

  • 必须使用 using 语句包裹 ZipArchive 和其底层 FileStream,确保资源释放顺序正确
  • 不要手动调用 stream.Close() 后再进 using,会导致重复关闭异常
  • 若目标路径已存在同名 zip 文件,FileMode.Create 会清空它,但旧文件句柄未释放时可能引发 IOException
using (var stream = new FileStream("output.zip", FileMode.Create))
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
{
    var entry = archive.CreateEntry("hello.txt");
    using (var writer = new StreamWriter(entry.Open()))
    {
        writer.Write("Hello from ZipArchive!");
    }
} // ← 关键:两个 using 都在此结束,保证中央目录写入完成

如何向已有 zip 文件添加新文件(非覆盖)?

ZipArchiveMode.Update 支持在现有 zip 中增删条目,但它要求底层流支持随机读写(如 FileStream),且不能是只读打开。直接用 FileMode.Open + FileAccess.ReadWrite 是必要前提;用 FileMode.Append 或只读流会抛出 NotSupportedException

  • 添加同名条目会自动替换原内容;删除条目需调用 entry.Delete()(.NET 6+)
  • 修改后必须让 ZipArchive 正常 dispose,否则变更不会落盘
  • 不建议对网络路径或 UNC 路径使用 Update 模式,容易因锁竞争失败
using (var stream = new FileStream("data.zip", FileMode.Open, FileAccess.ReadWrite))
using (var archive = new ZipArchive(stream, ZipArchiveMode.Update))
{
    var newEntry = archive.CreateEntry("new.log");
    using (var writer = new StreamWriter(newEntry.Open()))
    {
        writer.WriteLine(DateTime.Now);
    }
}

解压时如何避免路径遍历漏洞(如 ../web.config)?

ZipArchiveEntry.FullName 可能包含恶意路径片段,直接拼接 Path.Combine(extractTo, entry.FullName) 会导致文件被写到 zip 外目录。.NET 不做默认过滤,必须手动校验。

95Shop仿醉品商城
95Shop仿醉品商城

95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we

下载
  • Path.GetRelativePath(".", entry.FullName) 无法解决,因 .. 在开头时会返回绝对路径
  • 推荐做法:用 Path.GetFileName(entry.Name) 提取纯文件名,或用 Path.IsPathRooted() + entry.FullName.Contains("..") 拒绝非法条目
  • 更稳妥的是逐段检查 Path.GetFullPath(Path.Combine("fake", entry.FullName)) 是否仍以预期根目录开头
string extractTo = @"C:\unzip";
foreach (ZipArchiveEntry entry in archive.Entries)
{
    string destinationPath = Path.GetFullPath(Path.Combine(extractTo, entry.FullName));
    if (!destinationPath.StartsWith(Path.GetFullPath(extractTo) + Path.DirectorySeparatorChar))
    {
        throw new InvalidOperationException($"Suspicious path: {entry.FullName}");
    }
    entry.ExtractToFile(destinationPath, overwrite: true);
}

ZipArchive 和第三方库(如 SharpZipLib)的关键差异

ZipArchive 是 .NET Framework 4.5+ / .NET Core 内置方案,轻量、无额外依赖,但功能有限:不支持 ZIP64(超 4GB 文件)、不支持密码保护、不支持分卷压缩。遇到这些需求必须换库。

  • 压缩大文件(>2GB)时,ZipArchive 可能静默截断或抛 InvalidDataException,而 SharpZipLib 默认启用 ZIP64
  • 需要 AES 加密?ZipArchive 完全不支持;SharpZipLib 和 DotNetZip 提供 ZipEntry.IsAesEncrypted
  • 内存敏感场景:用 ZipArchive 解压时,entry.Open() 返回流不缓存全文,适合边读边处理;但压缩时所有内容必须先写入流,无法真正流式压缩

真正要稳定处理生产环境 zip,别只盯着 ZipArchive——它只是基础工具,不是万能解法。路径校验、大文件、加密、编码兼容性(如中文文件名),每个点都得单独补漏。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

347

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1078

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

178

2025.09.12

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.12.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

316

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

126

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

45

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

19

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.2万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号