在C#中提取.dmg文件

时间:2017-07-23 02:54:28

标签: c# 7zip dmg

最近我想到了这个问题:如何用C#提取 DMG 文件?

我做了大量的研究,我发现也许用7-zip库可以提取它但是当我尝试时,让我们说这是令人失望的;我无法让它发挥作用!

所以我想问,这真的可能吗?

还是有这个工作的图书馆吗?

这是我的代码:

ArchiveFile f = new ArchiveFile("path to dmg file", "path to 7z.dll");

        Console.WriteLine(f.Entries[0].FileName);
        Console.ReadKey();

1 个答案:

答案 0 :(得分:1)

使用'SevenZipExtractor'nuget包,以及类似于你的代码(下面),我遇到了一些问题。

我遇到的第一个问题是'SevenZipExtractor.SevenZipException',内部异常表明“%1不是有效的Win32应用程序”。这是因为编译为任何CPU,但使用64位7-zip安装。

我遇到的第二个问题是ArchiveFile类的'Entries'属性中的Null Reference Exception。对此进行反编译突出显示了相当多的内容。我删除了存储库,删除了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存储库中的项目,我只能假设此项目转换为a的方式有问题。 nuget包,这个包的应用方式有问题,或者项目中的bug已修复,包还没有更新。无论如何,由于缺少完整的代码发布和没有堆栈跟踪,你的问题是什么,或者发生了什么并不完全清楚,但我已经复制了一个类似的问题并且如上所述已经过去了。