聊到C#原生压缩,最直接的选择就是 `System.IO.Compression` 命名空间下的两个核心选手:`ZipFile.CreateFromDirectory` 和 `ZipArchive`。前者主打一个轻量省事,后者则提供更精细的控制力。但具体怎么选,背后有不少细节值得推敲。

c#如何压缩文件为zip_c#压缩文件为zip完整教程与代码实例

System.IO.Compression 压缩文件为 ZIP 是最轻量、无需第三方库的方案,但默认不支持密码保护和分卷,且对中文路径需额外处理编码问题。这一点,很多初次接触的同学容易忽略。

ZipFile.CreateFromDirectory 批量压缩整个文件夹

这算是最省事的方案了,适合打包一个完整目录。它内部自动处理文件遍历、时间戳、目录结构,一调用就完事。但几个限制得心里有数:

using System.IO.Compression;

ZipFile.CreateFromDirectory(@"C:\myfolder", @"C:\output.zip", CompressionLevel.Optimal, includeBaseDirectory: false);

ZipArchive 精确控制单个文件/子路径压缩

当需要跳过某些文件、重命名 ZIP 内路径、添加空目录,或统一设置编码时,ZipArchive 是唯一选择。它底层更灵活,但同时也要自己管理 ZipArchiveEntry 的创建与流写入,工作量稍微大一些。

using (var fs = File.Create(@"C:\custom.zip"))
using (var archive = new ZipArchive(fs, ZipArchiveMode.Create, lea veOpen: false))
{
    var entry = archive.CreateEntry("config/appsettings.json");
    using (var entryStream = entry.Open())
    using (var fileStream = File.OpenRead(@"D:\appsettings.json"))
    {
        fileStream.CopyTo(entryStream);
    }
}

压缩单个文件时别漏掉 includeBaseDirectory: false

如果误用 ZipFile.CreateFromDirectory 去“压缩一个文件”,常见做法是把它放进临时文件夹再压缩——这时若忘记设 includeBaseDirectory: false,ZIP 里就会多一层文件夹,比如 temp\myfile.txt 而非直接 myfile.txt,使用起来很不方便。

解压时路径穿越漏洞必须手动过滤

必须警惕的是,ZipFile.ExtractToDirectoryZipArchive.ExtractAll 默认不做路径校验。恶意 ZIP 若包含 ../../../etc/passwd 这类路径,可能覆写系统文件。这不是 .NET 的 bug,而是 ZIP 规范允许任意路径,防御责任在使用者身上。

真正麻烦的,往往不是压的过程,而是压完之后,别人能不能正常解压、文件名会不会乱码、有没有人故意塞个超长路径来搞事情——这些细节不写进代码里,上线后就是事故。

本文转载于:https://www.php.cn/faq/2334381.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。