我将如何在此代码中使用 Sevenzipsharp?

Posted

技术标签:

【中文标题】我将如何在此代码中使用 Sevenzipsharp?【英文标题】:How would i use Sevenzipsharp with this code? 【发布时间】:2010-06-24 08:10:45 【问题描述】:

iv 尝试了许多不同的方法来让它工作,我让它基本上工作,但我无法得到 WaitForExit();就像他们在这里一样工作......那么我将如何将它转换为与sevenzip一起使用?因为我不能让它工作,而且我的 SFX 是密码的,所以它们不能被访问,除非通过使用程序和添加 7z.DLL 我不能添加它,因为我收到错误:

无法添加对 7za.dll 的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

string tempFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
System.Diagnostics.Process defrag1 = System.Diagnostics.Process.Start(@"AusLogics_Defrag.exe", string.Format(" -o0 -y -Pthisisthepass", tempFolder));
defrag1.WaitForExit();
string executableDirectoryName = Path.GetDirectoryName(Application.ExecutablePath);
System.Diagnostics.Process defrag2 = System.Diagnostics.Process.Start(tempFolder + "\\" + "AusLogics_Defrag" + "\\" + "DiskDefrag.exe", "");
defrag2.WaitForExit();
System.IO.Directory.Delete(tempFolder + "\\" + "AusLogics_Defrag", true);

新:好吧,这就是我目前所拥有的,但我收到错误“无法加载 7-zip 库或内部 COM 错误!消息:加载库失败”

SevenZipExtractor.SetLibraryPath("7z.dll"); //no idea of this is needed or not
SevenZipCompressor.SetLibraryPath("7z.dll"); //no idea of this is needed or not
string tempFolder = Environment.GerFolderPath(Environment.SpecialFolder.ApplicationData);
SevenZipExtractor defrag = new SevenZipExtractor(@"Programs\Optimize\Auslogics_Defrag.7z");
defrag.ExtracArchive(string.Format("-o0 -y -PThisisthepass", tempFolder));

【问题讨论】:

您确定要添加对 .NET 组件而不是常规 dll 的引用吗?另外,您发布的代码片段与该问题有什么关系? 我很好奇我如何可以使用sevenzipsharps 命令但仍然使用“WaitForExit();”是因为我尝试它时它无法做到 【参考方案1】:

从您的 .NET 项目中引用 SevenZipSharp.dll 并确保您已将 7z DLL 作为构建后事件复制到目标输出目录。由于 7z.dll 不是 .NET 程序集,因此您的 .NET 项目无法直接引用它。

“Can not load 7-zip library or internal COM error! Message: failed to load library”有两种典型解释:

    明显是找不到 7z DLL。在这种情况下,在进行任何相关的 SevenZipSharp 调用之前,使用 DLL 的完整路径调用 SevenZipCompressor/SevenZipExtractor.SetLibraryPath()。相对路径也应该可以工作,但如果某些代码更改了进程的当前目录,请尝试绝对路径。获取绝对路径的一种策略是使用执行程序集的路径,请参见下面的示例。

    被引用的 DLL 的体系结构与当前进程不匹配。例如,您的 .NET 程序集正在运行 x64,但您引用了 32 位版本的 7z.dll。在这种情况下,您需要引用 7z64.dll。从 SevenZipSharp 的 release 下载 7-Zip DLL 二进制文件,以确保没有其他不匹配问题,并确保您使用的是正确的版本。

这是一个示例,如果 7z.dll 与使用它的程序集位于同一目录中,如何设置它的绝对路径:

SevenZip.SevenZipCompressor.SetLibraryPath(
    Path.Combine(
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),  
        "7z.dll"));

【讨论】:

+1 为我工作,但请注意,必须在实例化 SevenZipExtractor / SevenZipCompressor 之前调用 SetLibraryPath 【参考方案2】:

您需要添加对SevenZipSharp.dll 的引用,而不是常规的7za.dll7z.dll

由于您需要 7zip dll 可用,因此您需要将它们与您的代码一起打包 - 这并不意味着您需要引用它们。

您可以将解决方案/项目文件夹添加到您的应用程序并在那里添加所需的 dll。确保将他们的“复制到构建目录”属性设置为“如果较新则复制”。

【讨论】:

"SevenZipSharp 需要 7-zip 本机库才能运行。您可以在编译时在 LibraryManager.cs 中指定 7-zip dll(7z.dll、7za.dll 等)的路径" 但我在 Visual Studio 2010express 中,我没有看到 libraryManager.cs @NightsEVil - LibraryManager.cs 是一个 SevenZipSharp 源文件。 sevenzipsharp.codeplex.com/SourceControl/changeset/view/… 我不断收到“无法加载 7-zip 库或内部 COM 错误!消息:加载库失败”.. 为什么? @NightsEVil - 因为SevenZipSharp 需要访问 7zip dll。您可以添加配置应用设置(“7zLocation”),以便它知道它们的位置。 好吧,它可以放在闪存驱动器或 cd 上,所以它不会总是有相同的驱动器号,所以我可以做一个相对路径吗?【参考方案3】:

如果您使用 32 位版本的 .dll,您可以尝试将您的项目设置为首选 32 位架构。

  - From project properties...   Build  >  check "Prefer 32-bit"

【讨论】:

以上是关于我将如何在此代码中使用 Sevenzipsharp?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SevenZipSharp 创建压缩的 SFX 文件?

如何使用 SevenZipSharp 提取多卷 7z 文件?

SevenZipSharp - 如何使用 c# 将多个目录压缩成一个文件?

如何使用 Squid-Box.SevenZipSharp 在 C# 上压缩和解压缩文件 执行失败错误

SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

SevenZipSharp ExtractARchive 决定了错误的格式