在 C# (.NET) 中处理 ZIP 压缩文件
在现代 .NET 平台开发中,处理压缩文件是一项常见任务。无论是打包日志、创建备份还是通过网络传输数据,高效压缩和解压文件的能力是每位 C# 开发者的必备技能。本文将详细讲解两种主要方法:内置的 System.IO.Compression 命名空间和第三方库 SharpZipLib。
.NET 内置工具:System.IO.Compression
从 .NET Framework 4.5 开始,该平台提供了用于处理 ZIP 压缩文件的原生 API。主要类位于 System.IO.Compression 命名空间中。
创建 ZIP 压缩文件
使用 ZipArchive 类配合 ZipFile 来创建压缩文件:
using System.IO;using System.IO.Compression;
string sourceDirectory = @"C:\\Data\\Reports";string zipPath = @"C:\\Archives\\reports.zip";
if (File.Exists(zipPath)) File.Delete(zipPath);
ZipFile.CreateFromDirectory(sourceDirectory, zipPath);Console.WriteLine("压缩文件已创建: " + zipPath);解压压缩文件
解压操作类似,使用 ExtractToDirectory 方法:
string extractPath = @"C:\\Data\\Extracted";ZipFile.ExtractToDirectory(zipPath, extractPath);Console.WriteLine("压缩文件已解压到: " + extractPath);处理单个条目
如需更精细的控制,可直接使用 ZipArchive:
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"文件: {entry.FullName}, 大小: {entry.Length} 字节"); // 解压特定文件 entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), true); }}SharpZipLib 库
SharpZipLib 是一个功能强大的第三方开源库,与内置工具相比提供了更多高级功能。它支持更多格式(GZip、BZip2、Tar),并对压缩过程提供了更灵活的控制。
安装 SharpZipLib
通过 NuGet 包管理器安装该库:
Install-Package SharpZipLib或通过 .NET CLI:
dotnet add package SharpZipLib使用 SharpZipLib 创建压缩文件
using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Core;
string outputZip = @"C:\\Archives\\backup.zip";string[] filesToZip = Directory.GetFiles(@"C:\\Data\\Files", "*.*", SearchOption.AllDirectories);
using (FileStream fsOut = File.Create(outputZip))using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){ zipStream.SetLevel(9); // 最大压缩级别 (0-9)
foreach (string filename in filesToZip) { FileInfo fi = new FileInfo(filename); string entryName = ZipEntry.CleanName(fi.Name); ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = fi.LastWriteTime; newEntry.Size = fi.Length;
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096]; using (FileStream fsInput = File.OpenRead(filename)) { StreamUtils.Copy(fsInput, zipStream, buffer); } zipStream.CloseEntry(); }}使用 SharpZipLib 解压压缩文件
string inputZip = @"C:\\Archives\\backup.zip";string outputDir = @"C:\\Data\\Restored";
using (FileStream fsIn = File.OpenRead(inputZip))using (ZipInputStream zipStream = new ZipInputStream(fsIn)){ ZipEntry entry; while ((entry = zipStream.GetNextEntry()) !=