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

在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:\data\config.xml";
string zipPath = @"C:\output\config.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 = ""; 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); } } - test
注意事项与常见问题
实际使用时需留意几点:
- ZIP文件路径所在目录必须已存在,否则抛出 DirectoryNotFoundException
- CreateEntryFromFile 不支持通配符,多个文件需循环调用
- 默认压缩级别为 Optimal,如需控制(如更快但体积略大),需改用 ZipArchiveEntry.Open() + 手动压缩流(较复杂,一般不需要)
- 目标ZIP若已存在,FileMode.Create 会直接覆盖,无需提前删除
不复杂但容易忽略:确保XML文件有读取权限,且ZIP路径有写入权限。










