Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中提取.dmg文件#_C#_7zip_Dmg - Fatal编程技术网

C# 在C中提取.dmg文件#

C# 在C中提取.dmg文件#,c#,7zip,dmg,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); Con

这个问题最近进入了我的脑海:如何用C#提取DMG文件


我做了很多研究,我发现也许用7-zip库提取它是可能的,但当我尝试时,让我们说它令人失望;我不能让它工作

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

还是有图书馆可以做这项工作

这是我的代码:

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

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

使用“SevenZipExtractor”nuget包和类似于您的代码(见下文),我面临着几个问题

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

我面临的第二个问题是ArchiveFile类的“Entries”属性中的空引用异常。反编译强调了这里发生了很多事情。我拉下了存储库,删除了nuget包,并直接引用了该项目,目的是在库中调试该问题,但令人惊讶的是,这似乎能按预期工作

奇怪的是,(或者可能是因为我不知道DMG格式),我的测试DMG()没有列出我在使用7zip文件管理器打开它时看到的相同文件。我本来希望看到一个名为Firefox的文件夹,但却发现了3个文件:

  • 0.5分米
  • 1.苹果分区图
  • 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包的方式有问题,此包的应用方式有问题,或者项目中的bug已经修复,包尚未更新。不管怎样,由于没有发布完整的代码和没有堆栈跟踪,您的问题是什么,或者问题发生在哪里还不完全清楚,但我已经复制了一个类似的问题,并按照上面所述解决了它。

错误是什么?谁说带7-zip的dmg?ArchiveFile是7-zip库的一部分吗?它是一个Nuget软件包吗?@Jeremythonpson错误是“无法初始化SevenZipHandle”,它是sevenzipextractor库。您可以使用7zip使用此方法提取任何其他格式吗?@Gui是的,我尝试过。zip“无法初始化SevenZipHandle”表示它无法与7zip二进制文件交互。我认为任何存档文件类型都会失败。确保编译为32/64位,以匹配已安装的7zip版本。