在 C# 中,可以使用内置的 System.IO.Compression 命名空间轻松地将整个文件夹打包为 ZIP 文件。最直接的方法是使用 ZipFile.CreateFromDirectory 方法。
基本用法
csharp
using System.IO.Compression;
string sourceFolder = @"C:\SourceFolder"; // 要压缩的文件夹
string zipFile = @"C:\Archive.zip"; // 生成的 ZIP 文件路径
ZipFile.CreateFromDirectory(sourceFolder, zipFile);
该方法会将 sourceFolder 中的所有文件和子文件夹递归地添加到 ZIP 文件中。
高级选项
CreateFromDirectory 有多个重载,允许你控制压缩行为:
csharp
// 带 CompressionLevel 和 includeBaseDirectory 参数的重载
ZipFile.CreateFromDirectory(
sourceFolder,
zipFile,
CompressionLevel.Optimal, // 压缩级别(Optimal, Fastest, NoCompression)
true // 是否在 ZIP 中包含源目录本身作为根目录
);
includeBaseDirectory:如果为true,则 ZIP 文件中会包含源文件夹本身作为根目录(即解压后会出现一个与源文件夹同名的文件夹);如果为false,则源文件夹下的所有内容直接位于 ZIP 根目录。- 还可以使用
EntryNameEncoding参数指定文件名编码,或通过Overwrite参数控制是否覆盖已存在的 ZIP 文件(在 .NET 6+ 中)。
异常处理
注意捕获可能的异常,例如:
DirectoryNotFoundException:源文件夹不存在。IOException:目标 ZIP 文件已存在且被占用等。UnauthorizedAccessException:无权限访问文件。
添加对命名空间的引用
- .NET Framework 4.5+ :需要添加对
System.IO.Compression.FileSystem的程序集引用。 - .NET Core / .NET 5+ :直接使用
System.IO.Compression命名空间即可(通常已默认包含)。
完整示例
csharp
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main()
{
string folderPath = @"C:\MyFolder";
string zipPath = @"C:\MyFolder.zip";
try
{
// 检查源文件夹是否存在
if (!Directory.Exists(folderPath))
{
Console.WriteLine("源文件夹不存在。");
return;
}
// 如果目标 ZIP 文件已存在,可选择删除或覆盖
if (File.Exists(zipPath))
{
File.Delete(zipPath); // 或者使用 Overwrite 参数(.NET 6+)
}
// 创建 ZIP 文件,不包含基目录
ZipFile.CreateFromDirectory(folderPath, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"文件夹已成功打包为:{zipPath}");
}
catch (Exception ex)
{
Console.WriteLine($"出错:{ex.Message}");
}
}
}
其他注意事项
- 如果需要在压缩过程中过滤文件、处理大文件或显示进度,建议使用第三方库,如 SharpCompress 或 DotNetZip(注意许可证)。
- 在 ASP.NET 应用中,可能需要使用异步方式,可以考虑将
CreateFromDirectory包装在Task.Run中,或使用 .NET 6+ 提供的异步版本(如ZipFile.CreateFromDirectoryAsync)。
使用内置的 ZipFile 类足以满足大多数简单到中等复杂度的文件夹打包需求。