C#如何将XML文件压缩成ZIP包

11次阅读

最简单可靠的方式是使用.net内置System.IO.Compression命名空间;创建Filestream输出流,用ZipArchive.CreateEntryFromFile直接添加xml文件,支持单个或多个文件及内存字符串写入。

C#如何将XML文件压缩成ZIP包

在C#中将XML文件压缩成ZIP包,最简单可靠的方式是使用.NET内置的 System.IO.Compression 命名空间(.NET 4.5+),无需第三方库。核心步骤是:创建ZIP存档 → 将XML文件作为条目写入 → 关闭存档。

使用 ZipArchive 创建 ZIP 包

这是推荐方式,支持流式写入,内存占用低,适合单个或多个XML文件:

  • FileStream 创建输出ZIP文件流
  • 用该流初始化 ZipArchive(模式为 Create)
  • 调用 CreateEntryFromFile 直接把XML文件加入ZIP,自动处理路径和压缩

示例代码:

using System.IO; using System.IO.Compression;  string xmlPath = @"C:dataconfig.xml"; string zipPath = @"C:outputconfig.zip";  using (var zipStream = new FileStream(zipPath, FileMode.Create)) using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) {     // 将XML文件添加进ZIP,第二个参数指定ZIP内文件名(可含子目录)     archive.CreateEntryFromFile(xmlPath, "config.xml");     // 或存到子目录:archive.CreateEntryFromFile(xmlPath, "xml/config.xml"); }

压缩多个XML文件到同一个ZIP

只需多次调用 CreateEntryFromFile,注意ZIP内文件名不能重复:

  • 遍历XML文件列表(如 Directory.GetFiles("*.xml")
  • 对每个文件生成唯一ZIP内路径(例如用 Path.GetFileName 避免绝对路径)
  • 直接写入,无需手动读取文件内容

小技巧:若想保留原始目录结构,可用 Path.GetRelativePath(.NET Core 2.1+ / .NET 5+)生成相对路径作为ZIP条目名。

从内存XML字符串生成ZIP(不依赖磁盘文件)

如果XML内容来自字符串或 XDocument,可先转为字节数组,再用 CreateEntry 写入:

  • 调用 archive.CreateEntry(“data.xml”) 获取 ZipArchiveEntry
  • Open() 获取可写流,写入UTF-8编码的XML字节
  • 确保写完后流被正确关闭(using块自动处理)

示例片段:

string xmlContent = "test"; byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlContent);  using (var zipStream = new FileStream(zipPath, FileMode.Create)) using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) {     var entry = archive.CreateEntry("inline.xml");     using (var entryStream = entry.Open())     {         entryStream.Write(xmlBytes, 0, xmlBytes.Length);     } }

注意事项与常见问题

实际使用时需留意几点:

  • ZIP文件路径所在目录必须已存在,否则抛出 DirectoryNotFoundException
  • CreateEntryFromFile 不支持通配符,多个文件需循环调用
  • 默认压缩级别为 Optimal,如需控制(如更快但体积略大),需改用 ZipArchiveEntry.Open() + 手动压缩流(较复杂,一般不需要)
  • 目标ZIP若已存在,FileMode.Create 会直接覆盖,无需提前删除

不复杂但容易忽略:确保XML文件有读取权限,且ZIP路径有写入权限。

text=ZqhQzanResources