![]() |
JclSevenZip - Entpacken eines einzelnen Verzeichnisses
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
Ich verwende die 7-zip (sevenzip) Implementierung von JclSevenZip um Archive zu entpacken. Das funktioniert soweit sehr gut um einzelne Dateien oder das komplette Archiv zu entpacken. Nun habe ich aber ein Problem mit dem entpacken von speziellen gepackten Archiven von HP. Es handelt sich um Softpaqs (Diese enthalten z.B. Treiber oder Systemapplikationen, welche für HP Hardware verwendet werden. Leider sind diese Archive etwas sonderbar aufgebaut, im root des Archives befindet sich ein unbenanntes Verzeichnis. Dieses kann man aber mit [0] adressieren. Nun gut, langer Rede, kurzer Sinn, mit folgendem Code kann ich zwar das [0] Verzeichnis in einen Ordner entpacken, nicht aber, das ich direkt den Inhalt von [0] in einen Ordner entpacken kann:
Delphi-Quellcode:
Der Aufruf geschieht mit:
// === Extract Folder with 7-zip =================================================
// uses: JclCompression procedure TfCommunication.Extract7ZipFolder(ZipFilePath,PackedFolderName,TargetFolder:String); var archiveclass: TJclDecompressArchiveClass; archive: TJclDecompressArchive; item: TJclCompressionItem; s: String; i: Integer; begin archiveclass := GetArchiveFormats.FindDecompressFormat(ZipFilePath); if not Assigned(archiveclass) then raise Exception.Create('Could not determine the Format of ' + ZipFilePath); archive := archiveclass.Create(ZipFilePath); try if not (archive is TJclSevenZipDecompressArchive) then raise Exception.Create('This format is not handled by 7z.dll'); archive.ListFiles; s := Format('test.zip Item Count: %d'#13#10#13#10, [archive.ItemCount]); for i := 0 to archive.ItemCount - 1 do begin item := archive.Items[i]; case item.Kind of ikFile : s := s + IntToStr(i+1) + ': ' + item.PackedName + #13#10; ikDirectory : s := s + IntToStr(i+1) + ': ' + item.PackedName + '\'#13#10; end; end; if archive.ItemCount > 0 then begin for i := 0 to archive.ItemCount - 1 do begin If archive.Items[i].PackedName = PackedFolderName then Archive.Items[i].Selected := true; end; ForceDirectories(TargetFolder); archive.ExtractSelected(TargetFolder, true); end; finally Archive.Free; end; end;
Delphi-Quellcode:
Als Ergebnis erhalte ich "C:\HP\[0]". Ich möchte aber "C:\HP\file1... file2 etc."
Extract7ZipFolder('C:\sp38117.exe','[0]','C:\HP');
Im Anhang ein solches Softpaq (Gezippt mit 7-zip), welches entpackt die sp38117.exe ergibt, die ich wiederum mit meiner Funktion entpcken möchte. Hat jemand eine Idee? |
AW: JclSevenZip - Entpacken eines einzelnen Verzeichnisses
Der Aufbau ist ein wenig anders.
Die Exe ist eine Ausführbare-7z Datei. So aber "[0]" ist nochmal eine Datei. Die ist vom Format Cab. Wenn du die Exe mal mit WinRar öffnest steht oben das Format. Villeicht hilft dir das weiter. Es ist ein SFX Cab Archive. Die Exe ist mit 7z anscheinend gepacked, und diese enthält eine Datei namens "[0]". Und diese "[0]" ist wie schon erwähnt eine CAB-Datei; EDIT: Jcl, erkennt die Datei falsch, bzw. sie erkennt das oberste Format. Und nicht das eigentlich "gewollte" Format. Edit2: Ich habe es mal so versucht, jedoch entpacket er mir nicht die Datei, vermutlich weil die Dateinamen einen "\" am Anfang haben. Diese SFX Cab Format stammt irgendwie von 7z ab, bzw. Jcl arbeitet damit.
Delphi-Quellcode:
Gruß NickelM
procedure Extract7ZipFolder(ZipFilePath,TargetFolder:String);
var archive: TJclCabDecompressArchive; item: TJclCompressionItem; s: String; i: Integer; begin archive := TJclCabDecompressArchive.Create(ZipFilePath); try if not (archive is TJclSevenZipDecompressArchive) then raise Exception.Create('This format is not handled by 7z.dll'); archive.ListFiles; s := Format('test.zip Item Count: %d'#13#10#13#10, [archive.ItemCount]); for i := 0 to archive.ItemCount - 1 do begin item := archive.Items[i]; case item.Kind of ikFile : s := s + IntToStr(i+1) + ': ' + item.PackedName + #13#10; ikDirectory : s := s + IntToStr(i+1) + ': ' + item.FileName + '\'#13#10; end; end; if archive.ItemCount > 0 then begin archive.ExtractAll(TargetFolder); end; finally Archive.Free; end; end; |
AW: JclSevenZip - Entpacken eines einzelnen Verzeichnisses
Hallo NickelM,
besten Dank für Deinen Stuppser in die richtige Richtung! Besonders das hier hat mir geholfen: Zitat:
Delphi-Quellcode:
Alles in allem sieht das nun so aus:
item.FileName := TargetFolder +item.PackedName;
Delphi-Quellcode:
procedure Extract7ZipFolder(ZipFilePath,TargetFolder:String);
var archive: TJclCabDecompressArchive; item: TJclCompressionItem; s: String; i: Integer; begin archive := TJclCabDecompressArchive.Create(ZipFilePath); // archive.OnProgress := ArchiveProgress; try if not (archive is TJclSevenZipDecompressArchive) then raise Exception.Create('This format is not handled by 7z.dll'); archive.ListFiles; s := Format('test.zip Item Count: %d'#13#10#13#10, [archive.ItemCount]); for i := 0 to archive.ItemCount - 1 do begin item := archive.Items[i]; case item.Kind of ikFile : s := s + IntToStr(i+1) + ': ' + item.PackedName + #13#10; ikDirectory : s := s + IntToStr(i+1) + ': ' + item.FileName + '\'#13#10; end; item.FileName := TargetFolder +item.PackedName; // = Set a Filename (Fullpath!) end; if archive.ItemCount > 0 then begin archive.ExtractAll(TargetFolder); end; finally Archive.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz