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 文件名,但需显式启用。
- 只靠
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 文件可能损坏或被锁住










