使用“SevenZipExtractor”nuget 包和类似于您的代码(如下)我遇到了几个问题。
我遇到的第一个问题是“SevenZipExtractor.SevenZipException”,内部异常指出“%1 不是有效的 Win32 应用程序”。这是由于编译为 Any CPU,但使用的是 64 位 7-zip 安装。
我遇到的第二个问题是来自 ArchiveFile 类的“Entries”属性中的空引用异常。反编译这突出了这里发生了很多事情。我拉下存储库,删除了 nuget 包,并直接引用了该项目,目的是在库中调试问题,但令人惊讶的是,这似乎按预期工作。
Github: SevenZipExtractor
奇怪的是,(或者可能是由于我对 DMG 格式的无知)我的测试 dmg (Firefox) 没有列出我使用 7zip 文件管理器打开它时看到的相同文件。我原以为会看到一个名为 Firefox 的文件夹,但发现了 3 个文件:
- 0.dmm
- 1.Apple_partition_map
- 2.hfs
我发现 HFS 文件包含使用 7zFM.exe 可以看到的所有文件,因此我将其提取出来,并使用之前在 DMG 上使用的相同方法打开它。
using System;
using System.IO;
using System.Linq;
using SevenZipExtractor;
namespace _7zip
{
class Program
{
static void Main(string[] args)
{
const string workingDirectory = @"C:\Profile\Repositories\7zipPlayground\7zip\bin\Debug\";
using (var archiveFile = new ArchiveFile(Path.Combine(workingDirectory, "test.dmg"), @"C:\Program Files\7-Zip\7z.dll"))
{
var files = archiveFile.Entries?.ToList();
foreach (var f in files)
{
Console.WriteLine($"File: {f.FileName}");
}
var hfsFile = files.FirstOrDefault(x => x.FileName.ToLower().Contains("hfs"));
if (hfsFile == null)
return;
hfsFile.Extract(Path.Combine(workingDirectory, hfsFile.FileName));
using (var hfsArchiveFile = new ArchiveFile(Path.Combine(workingDirectory, hfsFile.FileName), @"C:\Program Files\7-Zip\7z.dll"))
{
files = hfsArchiveFile.Entries?.ToList();
foreach (var f in files)
{
Console.WriteLine($"File: {f.FileName}");
}
}
}
Console.ReadLine();
}
}
}
由于上面的示例对我有用,使用我之前安装的 7zip 版本和上面 GitHub 存储库中的项目,我现在只能假设这个项目转换为nuget 包,此包的应用方式有问题,或者项目中已修复错误且包尚未更新。无论如何,由于缺少发布的完整代码且没有堆栈跟踪,尚不清楚您的问题是什么,或者问题发生在哪里,但我已经重现了一个类似的问题,并如上所述解决了它。