【问题标题】:Extract .dmg file in C#在 C# 中提取 .dmg 文件
【发布时间】:2017-07-23 02:54:27
【问题描述】:

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


我做了很多研究,发现也许可以使用 7-zip 库来提取它,但是当我尝试时,可以说它令人失望;我无法让它工作!

所以我想问一下,真的可以吗?

或者是否有适合这项工作的图书馆?

这是我的代码:

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

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

【问题讨论】:

  • 错误是什么?谁说 dmg 是 7-zip? ArchiveFile 是 7-zip 库的一部分,是 Nuget 包吗?
  • @JeremyThompson 错误是“无法初始化 SevenZipHandle”,它是 Sevenzipextractor 库
  • 你能用这个方法用7zip解压其他格式吗?
  • @Gui 是的,我试过 .zip
  • “无法初始化 SevenZipHandle”表明它无法与 7zip 二进制文件交互。我希望这对于任何存档文件类型都会失败。确保编译为 32/64 位以匹配您安装的 7zip 版本。

标签: c# 7zip dmg


【解决方案1】:

使用“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 包,此包的应用方式有问题,或者项目中已修复错误且包尚未更新。无论如何,由于缺少发布的完整代码且没有堆栈跟踪,尚不清楚您的问题是什么,或者问题发生在哪里,但我已经重现了一个类似的问题,并如上所述解决了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多