7z命令行压缩文件夹

5

我想使用7zG.exe的命令行压缩文件夹,但是我的代码只适用于文件而不是文件夹。能否有人展示一下正确使用7z命令行压缩文件夹的方式?这里是一个仅适用于文件的示例代码。每当我尝试运行此代码时,7zip会显示一个消息框,上面写着"无效参数"。

string sourceName = "Folder\Folder1";
string targetName = "Example.gz";

// 1
// Initialize process information.
//
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = "7zG.exe";

// 2
// Use 7-zip
// specify a=archive and -tgzip=gzip
// and then target file in quotes followed by source file in quotes
//
p.Arguments = "a -tgzip \"" + targetName + "\" \"" + sourceName + "\" -mx=9";
p.WindowStyle = ProcessWindowStyle.Hidden;

// 3.
// Start process and wait for it to exit
//
Process x = Process.Start(p);
x.WaitForExit();

你为什么要使用7zG呢?难道不应该使用7za,也就是只有命令行版本吗? - gunr2171
3
"-tgzip"不支持文件夹,请改用"-t7z"(即7zip格式)或其他格式(例如"-tzip")... - digEmAll
7zG和7za有什么区别? - Pacobart
1
7zG.exe 是 7zip 的图形用户界面模块,而 7z.exe 是命令行版本。7za.exe7z.exe 的独立版本(基本上不依赖于任何 DLL,比如 7z.dll)。 - digEmAll
尝试使用错误的参数从命令提示符中运行7zG.exe,您将获得一个模态对话框(即GUI模块)。您可以在额外的软件包中找到7za.exe(例如版本9.22的存档文件名为7z922_extra.7z)。我认为它是针对x86编译的,因此与x86和x64系统完全兼容。 - digEmAll
显示剩余2条评论
3个回答

10

根据评论部分所述,你需要使用7za.exe

这个链接提供了一个完整的示例行

代码将是这样的:

string sourceName = "Folder\Folder1";
string targetName = "Example.gz";

ProcessStartInfo p = new ProcessStartInfo();
//first change
p.FileName = "7za.exe"; 
//second change
p.Arguments = "a -tzip \"" + targetName + "\" \"" + sourceName + "\" -mx=9"; 
p.WindowStyle = ProcessWindowStyle.Hidden;
Process x = Process.Start(p);
x.WaitForExit();

5

gzipbzip2仅是压缩算法,不能用于压缩文件系统结构(例如文件夹、带文件的文件夹等)。

事实上,它们通常在tar压缩(支持文件夹)之前使用,以获得著名的(特别是在基于unix的系统中)tar.gztar.bz2存档。

在您的情况下,您可以使用-tzip-t7zip直接压缩一个文件夹:

p.Arguments = "a -t7z \"" + targetName + "\" \"" + sourceName + "\" -mx=9";

顺便提一下,你应该使用7za.exe而不是7zG.exe,因为后者是GUI模块,而前者是7zip的命令行独立版本(即它不依赖于任何其他dll),如7zip手册所述:

7z.exe是7-Zip的命令行版本。7z.exe使用7-Zip软件包中的7z.dll。 7z.dll也被7-Zip文件管理器使用。

7za.exe(a = alone)是7-Zip的独立版本。7za.exe仅支持7z、lzma、cab、zip、gzip、bzip2、Z和tar格式。7za.exe不使用外部模块。

你可以在额外的软件包中找到7za.exe,例如对于9.22版本,你可以在名为7z922_extra.7z的存档中找到它(链接)。

嗨digEmAll,这是一个非常好的解决方案。您是否进一步了解如何使用7z.dll而不使用7za.exe来完成此作业? - Bastian Ebeling
1
@BastianEbeling:是的,你可以这样做,但7z.dll是一个非托管dll(我认为是用c++编写的),你需要为其创建一个包装器。有一些示例和已经编写的库(例如这个),但如果你在这里下载包中查看,应该有一个以C#实现7z压缩算法的.cs文件... - digEmAll
嗨@dimEmAll,所以sda - 我只能找到一个压缩单个流的函数 - 而不是从一堆文件构建存档的函数。 - Bastian Ebeling
@BastianEbeling: 你看过这个链接了吗? - digEmAll

0

尝试使用这个命令:

7za  -tzip <archive-name> <folder-name>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接