2017-07-23 3 views
-1

Cette question est entrée récemment dans mon esprit: Comment puis-je extraire le fichier DMG avec C#?Extraire le fichier .dmg en C#


Je l'ai fait beaucoup de recherches et j'ai trouvé que peut-être il est possible avec la bibliothèque 7-zip pour l'extraire mais quand je l'ai essayé, disons qu'il était décevant; Je n'arrive pas à le faire marcher!

donc je veux demander, est-ce vraiment possible?

ou y a-t-il une bibliothèque pour ce travail?

ceci est mon code:

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

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

Quelle est l'erreur? Qui a dit dmg avec 7-zip? ArchiveFile fait-il partie de la bibliothèque 7-zip, est-ce un paquet Nuget? –

+0

Erreur @JeremyThompson était "Impossible d'initialiser SevenZipHandle" et sa bibliothèque sevenzipextractor – Comtuber

+0

Pouvez-vous extraire tout autre format avec cette méthode en utilisant 7zip? – Gui

Répondre

0

Utilisation du package 'SevenZipExtractor' NuGet, et un code similaire à la vôtre (ci-dessous) Je fait face à quelques problèmes.

Le premier problème auquel j'ai été confronté était une 'SevenZipExtractor.SevenZipException', avec une exception interne indiquant que "% 1 n'est pas une application Win32 valide". Cela était dû à la compilation en tant que Tout processeur, mais en utilisant une installation 7-zip 64 bits.

Le deuxième problème auquel je faisais face était une exception de référence nulle dans la propriété 'Entrées' de la classe ArchiveFile. Décompiler cela a mis en évidence que quelque chose se passait ici. J'ai retiré le dépôt, retiré le paquet de nuget, et référencé le projet directement avec l'intention de déboguer le problème dans la bibliothèque, mais étonnamment cela a semblé fonctionner comme prévu.

Github: SevenZipExtractor

Chose curieuse, (ou peut-être à cause de mon ignorance du format DMG) mon dmg test (Firefox) n'a pas une liste des mêmes fichiers que je vois quand je l'ouvre avec le Gestionnaire de fichiers 7zip. Je me attendais à voir un seul dossier nommé Firefox, mais au lieu découvert 3 fichiers:

  • 0.dmm
  • 1.Apple_partition_map
  • 2.hfs

Je trouve que le fichier HFS contenait tous les fichiers que je pouvais voir en utilisant 7zFM.exe, donc j'ai extrait ceci, et l'ai ouvert en utilisant la même méthode que précédemment utilisée sur le 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(); 
     } 
    } 
} 

Comme l'exemple ci-dessus fonctionne pour moi, en utilisant ma version précédemment installée de 7zip et le projet à partir du référentiel GitHub ci-dessus, je ne peux que supposer à ce stade qu'il ya soit quelque chose de mal avec la façon dont ce projet est transformé en un paquet de nuget, quelque chose ne va pas avec la façon dont ce paquet est appliqué, ou un bogue a été corrigé dans le projet et le paquet n'a pas encore été mis à jour. Peu importe, il n'était pas tout à fait clair quel était votre problème, ou où il s'est produit en raison de l'absence de code complet affiché et aucune trace de pile, mais j'ai reproduit un problème similaire et progressé comme décrit ci-dessus.