ZipFile.CreateFromDirectory() 是压缩整个文件夹最简单方法,一行代码即可完成,但不支持密码、压缩级别设置,且不包含空文件夹;需注意路径合法性与覆盖行为。

用 System.IO.Compression.ZipFile 压缩整个文件夹最简单
只要目标是 .NET Framework 4.5+ 或 .NET Core 2.0+,ZipFile.CreateFromDirectory() 就是首选——它一行代码就能把整个目录打成 ZIP,不用手动遍历文件或处理流。
注意:该方法会递归压缩子目录,但不会包含空文件夹(这是默认行为,无法关闭)。
-
sourceDirectoryName必须是真实存在的目录路径,不能以\或/结尾 -
destinationArchiveFileName若已存在,会被直接覆盖(无提示) - 不支持设置密码、压缩级别或跨卷分包
using System.IO.Compression; ZipFile.CreateFromDirectory(@"C:\mydata", @"C:\backup\mydata.zip");
用 ZipArchive 手动添加文件,控制粒度更细
当需要跳过某些文件、修改压缩级别、添加空文件夹,或者只压缩部分指定文件时,就得用 ZipArchive + ZipArchiveMode.Create。
关键点在于:每个待压缩项都要调用 CreateEntryFromFile() 或 CreateEntry(),且源路径必须是绝对路径或能被正确解析的相对路径;目标 ZIP 内路径(entry name)要用正斜杠 / 分隔,不能用反斜杠。
- 压缩级别通过
CompressionLevel.Optimal/Fastest控制,仅在CreateEntryFromFile()中生效 - 若用
CreateEntry()创建空条目再写入流,需手动处理编码和时间戳 - 务必用
using确保ZipArchive和底层FileStream被释放,否则 ZIP 文件可能损坏
using (var archive = ZipFile.Open(@"C:\output.zip", ZipArchiveMode.Create))
{
archive.CreateEntryFromFile(@"C:\report.txt", "docs/report.txt");
archive.CreateEntryFromFile(@"C:\config.json", "config.json", CompressionLevel.Optimal);
}
解压 ZIP 用 ZipFile.ExtractToDirectory() 最省心
如果 ZIP 包结构干净(没有绝对路径、没有 ../ 路径穿越),直接用 ExtractToDirectory() 即可。它会自动重建目录结构,并跳过重复文件(默认抛异常,可用 overwriteFiles: true 覆盖)。
95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we
风险点在于:ZIP 中若含恶意路径(如 ..\..\windows\system32\evil.dll),此方法不做路径净化,可能造成任意文件写入——生产环境必须先校验 entry 名称。
-
destinationDirectoryName必须是已存在的父目录,方法不会自动创建父级(例如C:\missing\folder会失败) - 不支持按条件筛选解压(比如只解压
.log文件),得先用ZipFile.OpenRead()遍历过滤
ZipFile.ExtractToDirectory(@"C:\archive.zip", @"C:\extracted", overwriteFiles: true);
遇到“拒绝访问”或“文件正在使用”错误怎么办
常见于解压时目标文件被其他进程锁定,或压缩时源文件正被写入。.NET 的 ZIP API 不提供重试或跳过机制,必须自己处理。
根本原因不是 ZIP 格式问题,而是 Windows 文件系统锁。建议在操作前检查文件是否可读/可写,并捕获 IOException 和 UnauthorizedAccessException。
- 用
File.GetAttributes(path).HasFlag(FileAttributes.ReadOnly)判断只读属性 - 解压前对目标目录执行
Directory.CreateDirectory()确保路径存在 - 不要依赖
File.Exists()判断能否写入——它不检测权限,应尝试File.OpenWrite().Close()预检
路径穿越、编码不一致(如 ZIP 由 Java 工具生成且含 UTF-8 路径)、ZIP 中含符号链接等情况,都可能触发静默失败或乱码,这些细节容易被忽略。









