在C#项目中实现7z格式文件压缩,核心思路分为两种:一种是直接调用系统安装的7-Zip软件的命令行工具完成压缩操作,另一种是通过集成第三方封装库来调用7-Zip的核心功能。两种方式各有适用场景,开发者可以根据项目实际需求选择。

方案一:调用7-Zip命令行实现压缩
这种方式的前提是目标运行环境已经安装了7-Zip软件,或者项目中携带了7z.exe可执行文件。C#通过Process类启动命令行进程,传入对应的压缩参数即可完成操作。
基础压缩代码示例
以下代码实现了将指定文件夹下的所有内容压缩为7z文件的功能:
using System;
using System.Diagnostics;
public class SevenZipCommandLineHelper
{
/// <summary>
/// 调用7-Zip命令行压缩文件或文件夹为7z格式
/// </summary>
/// <param name="sevenZipPath">7z.exe的路径</param>
/// <param name="sourcePath">待压缩的文件或文件夹路径</param>
/// <param name="outputPath">输出的7z文件路径</param>
/// <returns>是否压缩成功</returns>
public static bool CompressTo7z(string sevenZipPath, string sourcePath, string outputPath)
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = sevenZipPath,
// 参数说明:a表示添加文件到压缩包,输出路径,源路径
Arguments = $"a "{outputPath}" "{sourcePath}"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (Process process = Process.Start(startInfo))
{
process.WaitForExit();
// 进程退出码为0表示执行成功
return process.ExitCode == 0;
}
}
catch (Exception ex)
{
Console.WriteLine($"压缩失败:{ex.Message}");
return false;
}
}
}
// 调用示例
class Program
{
static void Main()
{
string sevenZipExePath = @"C:Program Files7-Zip7z.exe";
string sourceFolder = @"D:TestFiles";
string output7zFile = @"D:TestOutput.7z";
bool result = SevenZipCommandLineHelper.CompressTo7z(sevenZipExePath, sourceFolder, output7zFile);
Console.WriteLine(result ? "压缩成功" : "压缩失败");
}
}
常用命令行参数说明
如果需要调整压缩级别、设置密码等,可以修改Arguments参数,常用参数如下:
-mx=压缩级别:0-9,数字越大压缩率越高速度越慢,默认5-p密码:设置压缩包密码,例如-p123456-t7z:指定压缩格式为7z,默认也是7z可省略-r:递归压缩子文件夹内容
方案二:使用SevenZipSharp库实现压缩
如果不想在目标环境依赖7-Zip安装,或者需要更灵活的压缩控制,可以使用SevenZipSharp这个第三方库,它是7-Zip核心库的C#封装,不需要单独安装7-Zip软件,只需要携带7z.dll文件即可。
环境准备
首先通过NuGet安装SevenZipSharp包,然后将对应平台的7z.dll(可以从7-Zip安装目录获取,或者从NuGet包的安装目录获取)放到项目输出目录,或者在代码中指定7z.dll的路径。
基础压缩代码示例
以下代码使用SevenZipSharp实现文件夹压缩为7z文件:
using System;
using SevenZip;
public class SevenZipLibraryHelper
{
/// <summary>
/// 使用SevenZipSharp压缩文件或文件夹为7z格式
/// </summary>
/// <param name="sevenZipDllPath">7z.dll的路径</param>
/// <param name="sourcePath">待压缩的文件或文件夹路径</param>
/// <param name="outputPath">输出的7z文件路径</param>
public static void CompressTo7z(string sevenZipDllPath, string sourcePath, string outputPath)
{
// 设置7z.dll的路径
SevenZipBase.SetLibraryPath(sevenZipDllPath);
// 创建压缩器实例,指定压缩格式为7z
using (SevenZipCompressor compressor = new SevenZipCompressor())
{
compressor.ArchiveFormat = OutArchiveFormat.SevenZip;
// 设置压缩级别为正常
compressor.CompressionLevel = CompressionLevel.Normal;
// 递归压缩子目录
compressor.IncludeEmptyDirectories = true;
// 判断源路径是文件还是文件夹
if (System.IO.Directory.Exists(sourcePath))
{
compressor.CompressDirectory(sourcePath, outputPath);
}
else if (System.IO.File.Exists(sourcePath))
{
compressor.CompressFiles(outputPath, sourcePath);
}
else
{
throw new Exception("待压缩的路径不存在");
}
Console.WriteLine("压缩完成");
}
}
}
// 调用示例
class Program
{
static void Main()
{
string sevenZipDllPath = @"D:Libs7z.dll";
string sourceFolder = @"D:TestFiles";
string output7zFile = @"D:TestOutput.7z";
try
{
SevenZipLibraryHelper.CompressTo7z(sevenZipDllPath, sourceFolder, output7zFile);
}
catch (Exception ex)
{
Console.WriteLine($"压缩失败:{ex.Message}");
}
}
}
高级功能扩展
SevenZipSharp还支持很多高级功能,比如压缩进度回调、设置密码、分卷压缩等:
- 进度回调:订阅
compressor.Compressing事件,可以获取压缩进度百分比 - 设置密码:给
compressor.Password属性赋值即可设置压缩包密码 - 分卷压缩:设置
compressor.VolumeSize属性,指定每个分卷的大小,单位是字节
两种方案对比
可以通过以下表格快速选择适合自己项目的方案:
| 对比维度 | 调用7-Zip命令行 | 使用SevenZipSharp库 |
|---|---|---|
| 依赖要求 | 需要7z.exe存在 | 需要7z.dll存在 |
| 实现复杂度 | 低,仅需几行代码 | 中等,需要引入NuGet包 |
| 灵活性 | 低,仅能通过命令行参数控制 | 高,支持事件、属性配置 |
| 适用场景 | 简单压缩需求,环境已安装7-Zip | 复杂压缩需求,需要控制进度、密码等 |
注意事项
实际使用中需要注意以下几点:
- 路径中如果包含空格,需要用英文双引号包裹路径,避免命令行解析错误
- 使用命令行方式时,要确保7z.exe的架构和项目目标平台一致,避免32位程序调用64位7z.exe出现兼容问题
- SevenZipSharp的7z.dll需要和项目目标平台匹配,x86项目用x86的dll,x64项目用x64的dll
- 压缩大文件时建议异步执行,避免阻塞主线程,尤其是带界面的程序
C#7-Zip7z压缩命令行调用SevenZipSharp修改时间:2026-06-09 09:18:36