在 C# (.NET) 中处理 ZIP/压缩文件:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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()) !=

推荐