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.
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? –
Erreur @JeremyThompson était "Impossible d'initialiser SevenZipHandle" et sa bibliothèque sevenzipextractor – Comtuber
Pouvez-vous extraire tout autre format avec cette méthode en utilisant 7zip? – Gui