最近我想到了这个问题:如何用C#提取 DMG 文件?
我做了大量的研究,我发现也许用7-zip库可以提取它但是当我尝试时,让我们说这是令人失望的;我无法让它发挥作用!
所以我想问,这真的可能吗?
还是有这个工作的图书馆吗?
这是我的代码:
ArchiveFile f = new ArchiveFile("path to dmg file", "path to 7z.dll");
Console.WriteLine(f.Entries[0].FileName);
Console.ReadKey();
答案 0 :(得分:1)
使用'SevenZipExtractor'nuget包,以及类似于你的代码(下面),我遇到了一些问题。
我遇到的第一个问题是'SevenZipExtractor.SevenZipException',内部异常表明“%1不是有效的Win32应用程序”。这是因为编译为任何CPU,但使用64位7-zip安装。
我遇到的第二个问题是ArchiveFile类的'Entries'属性中的Null Reference Exception。对此进行反编译突出显示了相当多的内容。我删除了存储库,删除了nuget包,并直接引用了项目,目的是调试库中的问题,但令人惊讶的是,这似乎按预期工作。
奇怪的是,(或者由于我对DMG格式的无知)我的测试dmg(Firefox)没有列出我用7zip文件管理器打开它时看到的相同文件。我原本希望看到一个名为Firefox的文件夹,而是发现了3个文件:
我发现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存储库中的项目,我只能假设此项目转换为a的方式有问题。 nuget包,这个包的应用方式有问题,或者项目中的bug已修复,包还没有更新。无论如何,由于缺少完整的代码发布和没有堆栈跟踪,你的问题是什么,或者发生了什么并不完全清楚,但我已经复制了一个类似的问题并且如上所述已经过去了。