在C# (.NET)中处理ZIP压缩文件:完整指南
在.NET平台的现代开发中,处理压缩文件是一项常见任务。无论是打包日志、解压配置文件还是创建备份——内置的System.IO.Compression工具都能高效完成,无需第三方库。本文将介绍在C#中处理ZIP压缩文件的基本操作,包括压缩、解压、添加文件以及流处理。
必需的命名空间
在.NET中处理压缩文件需要使用两个主要的命名空间:
using System.IO;using System.IO.Compression;从.NET Framework 4.5开始,ZipFile类在System.IO.Compression.FileSystem程序集中可用。在.NET Core / .NET 5+中,它已包含在基础库中。
从文件创建ZIP压缩文件
创建压缩文件最简单的方法是使用静态方法ZipFile.CreateFromDirectory。它接受文件夹路径、压缩文件路径和压缩级别。
string sourceFolder = @"C:\\Temp\\Documents";string zipPath = @"C:\\Temp\\backup.zip";
// 使用Optimal压缩级别创建压缩文件ZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"压缩文件已创建: {zipPath}");参数说明:
- sourceFolder — 源目录;
- zipPath — 目标压缩文件的路径;
- CompressionLevel —
Optimal、Fastest或NoCompression; - includeBaseDirectory — 如果为
true,压缩文件中将包含根文件夹。
解压ZIP压缩文件
使用ZipFile.ExtractToDirectory方法提取文件:
string zipPath = @"C:\\Temp\\backup.zip";string extractPath = @"C:\\Temp\\Restored";
// 解压并覆盖现有文件ZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);
Console.WriteLine("压缩文件已解压。");在.NET 6+中,新增了overwriteFiles参数,允许覆盖文件而不会引发异常。
向现有压缩文件中添加文件
ZipArchive类提供了对内容的完全控制。以更新模式打开压缩文件并添加新文件:
string zipPath = @"C:\\Temp\\backup.zip";string newFile = @"C:\\TempewDocument.txt";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.ReadWrite))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update)){ // 在压缩文件中创建条目 ZipArchiveEntry entry = archive.CreateEntry("newDocument.txt");
using (StreamWriter writer = new StreamWriter(entry.Open())) { writer.Write("这是新文件的内容。"); }
Console.WriteLine($"文件 {newFile} 已添加到压缩文件。");}重要提示:使用ZipArchiveMode.Update时,压缩文件必须以读写模式打开。
不解压读取压缩文件内容
有时只需查看压缩文件内部有哪些文件。遍历压缩文件条目即可:
string zipPath = @"C:\\Temp\\backup.zip";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.Read))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"文件: {entry.FullName}, 大小: {entry.Length} 字节"); }}FullName属性包含压缩文件内的路径,包括子文件夹。
流处理:内存中的压缩与解压
对于需要通过网络传输或保存到数据库的场景,使用MemoryStream非常方便: