在 C# (.NET) 中处理 ZIP 压缩包:创建、读取和管理
在现代应用程序中,经常需要压缩文件以节省空间或方便传输。.NET 平台开箱即用地提供了强大且便捷的工具来处理 ZIP 压缩包。通过使用 System.IO.Compression 命名空间,您可以轻松地创建、提取和修改压缩包,而无需安装第三方库。本文将详细讲解所有基本操作。
引入必要的命名空间
开始之前,请确保您的项目中添加了以下指令:
using System;using System.IO;using System.IO.Compression;using System.Linq;创建 ZIP 压缩包
创建压缩包最简单的方法是使用 ZipFile 类。该类从 .NET Framework 4.5 和 .NET Core 开始可用。
从单个文件夹创建压缩包
string sourceDirectory = @"C:\\MyDocuments";string zipFilePath = @"C:\\MyArchive.zip";
// 从指定文件夹中的所有文件创建压缩包ZipFile.CreateFromDirectory(sourceDirectory, zipFilePath);Console.WriteLine("压缩包已创建: " + zipFilePath);使用附加参数创建压缩包
您可以指定压缩级别并在压缩包内添加路径前缀:
string sourceDir = @"C:\\Data";string outputZip = @"C:\\Data.zip";
// CompressionLevel.Optimal - 最大压缩// includeBaseDirectory: true - 保留文件夹结构ZipFile.CreateFromDirectory( sourceDir, outputZip, CompressionLevel.Optimal, includeBaseDirectory: true);Console.WriteLine("压缩包已优化创建.");从压缩包中提取文件
将整个压缩包解压到文件夹
string zipPath = @"C:\\MyArchive.zip";string extractPath = @"C:\\ExtractedFiles";
// 解压所有内容ZipFile.ExtractToDirectory(zipPath, extractPath);Console.WriteLine("压缩包已成功解压.");解压并覆盖现有文件
// 在 .NET 6+ 中可以指定覆盖ZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);处理压缩包中的单个条目
ZipArchive 类提供了对压缩包内容的完全控制。
读取压缩包中的文件列表
using (ZipArchive archive = ZipFile.OpenRead(@"C:\\Archive.zip")){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"文件: {entry.FullName}, 大小: {entry.Length} 字节"); }}从压缩包中提取特定文件
string zipFilePath = @"C:\\Archive.zip";string entryName = @"folder\\document.txt"; // 压缩包内的路径string outputPath = @"C:\\Output\\document.txt";
using (ZipArchive archive = ZipFile.OpenRead(zipFilePath)){ ZipArchiveEntry entry = archive.GetEntry(entryName); if (entry != null) { // 提取文件 entry.ExtractToFile(outputPath, overwrite: true); Console.WriteLine($"文件 '{entryName}' 已提取."); } else { Console.WriteLine("压缩包中未找到该文件."); }}向现有压缩包添加和删除文件
要修改现有压缩包,请以 ZipArchiveMode.Update 模式打开它:
向压缩包添加新文件
string existingZip = @"C:\\Archive.zip";string fileToAdd = @"C:\\NewFile.txt";
using (ZipArchive archive = ZipFile.Open(existingZip, ZipArchiveMode.Update)){ // 以名称 "NewFile.txt" 将文件添加到压缩包根目录 archive.CreateEntryFromFile(fileToAdd, "NewFile.txt"); Console.WriteLine("文件已添加到压缩包.");}从压缩包中删除文件
using (ZipArchive archive