跳转到主内容
极星编程网:以代码为星,赴技术山海!

C#怎么压缩文件夹_C#如何使用ZipFile创建压缩包【示例】

ZipFile.CreateFromDirectory 压缩为空常见因路径错误或权限不足,静默跳过不可读文件;不支持过滤、中文乱码需用ZipArchive+UTF8编码;大文件应避免全内存加载,改用流式压缩。 ZipFile.CreateFromDirectory 为什么压缩出来是空的 常见原因是目标文件夹路径写错,或者权限不足导致读取失败。这个函数不会抛异常,静默跳过不可读文件,最终生成一个合法但内容为空的 ZIP。
ZipFile.CreateFromDirectory
只递归打包目录下的文件和子目录,不处理符号链接、隐藏文件(如
.git
)或系统属性标记的文件 确保传入的
sourceDirectoryName
是绝对路径,相对路径容易因工作目录不同而失效;建议用
Path.GetFullPath
标准化 目标 ZIP 文件路径所在的父目录必须已存在,否则会抛
DirectoryNotFoundException
;
ZipFile
不自动创建上级目录 压缩时怎么排除 .git 或 bin/obj 这类目录 标准
ZipFile.CreateFromDirectory
不支持过滤,得自己遍历 + 手动构造 ZIP。核心思路:用
ZipArchive
配合
Directory.GetFiles
和条件判断。 先用
Directory.EnumerateFiles
获取所有文件路径,逐个检查是否在要排除的路径前缀中(比如
filePath.StartsWith(excludePath, StringComparison.OrdinalIgnoreCase)
) 对每个保留的文件,用
archive.CreateEntryFromFile
加入 ZIP,并注意设置
entryName
为相对于源根的路径(否则解压后全堆在根目录) 别直接用
File.Copy
往 ZIP 里塞——ZIP 不是普通文件容器,必须走
ZipArchive
的 API 中文文件名乱码怎么办 默认用 IBM437 编码存文件名,Windows 系统下中文显示为 。.NET Core 6+ 和 .NET 5+ 已支持 ZIP64 和 UTF-8 文件名,但需显式启用。 C知道 CSDN推出的一款AI技术问答工具 下载 只靠
ZipFile.CreateFromDirectory
无法开启 UTF-8;必须用
ZipArchiveMode.Create
构造
ZipArchive
,并传入
leaveOpen: false
和
encoding: Encoding.UTF8
注意:旧版 Windows 资源管理器(Win10 1809 之前)不识别 UTF-8 文件名,解压后可能仍乱码;推荐用 7-Zip 或 Bandizip 打开验证 如果目标环境不确定,宁可把中文路径转成拼音或 UUID 命名,比依赖编码更稳 大文件压缩卡死或内存爆掉
ZipFile.CreateFromDirectory
是全内存加载模式:它先把所有文件读进内存再写 ZIP,遇到几个 GB 的日志目录很容易 OOM。 改用流式压缩:用
ZipArchive
+
FileStream
+
BufferedStream
分块读写,控制单次读取大小(如 8192 字节) 避免一次性
File.ReadAllBytes
;对大文件用
stream.CopyTo
直接管道传输 记得在
using
块里释放
ZipArchive
和底层
FileStream
,否则 ZIP 文件可能损坏或被锁住 事情说清了就结束。真正难的不是调哪个函数,而是判断该不该压缩、要不要分卷、谁来解压、解压环境支不支持 UTF-8——这些不在代码里,但在上线前得想明白。

相关文章