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

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

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

开始课程

在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非常方便:

推荐