AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein JclSevenZip - Entpacken eines einzelnen Verzeichnisses
Thema durchsuchen
Ansicht
Themen-Optionen

JclSevenZip - Entpacken eines einzelnen Verzeichnisses

Ein Thema von nytaiceman · begonnen am 20. Jun 2012 · letzter Beitrag vom 5. Jul 2012
Antwort Antwort
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#1

JclSevenZip - Entpacken eines einzelnen Verzeichnisses

  Alt 20. Jun 2012, 23:24
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:
// === 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;
Der Aufruf geschieht mit:
 Extract7ZipFolder('C:\sp38117.exe','[0]','C:\HP'); Als Ergebnis erhalte ich "C:\HP\[0]". Ich möchte aber "C:\HP\file1... file2 etc."

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?
Angehängte Dateien
Dateityp: 7z sp38117.7z (1,81 MB, 7x aufgerufen)
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#2

AW: JclSevenZip - Entpacken eines einzelnen Verzeichnisses

  Alt 21. Jun 2012, 01:00
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:
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;
Gruß NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (21. Jun 2012 um 01:25 Uhr)
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#3

AW: JclSevenZip - Entpacken eines einzelnen Verzeichnisses

  Alt 5. Jul 2012, 23:17
Hallo NickelM,

besten Dank für Deinen Stuppser in die richtige Richtung!

Besonders das hier hat mir geholfen:
Zitat:
Edit2: Ich habe es mal so versucht, jedoch entpacket er mir nicht die Datei, vermutlich weil die Dateinamen einen "\" am Anfang haben.
Wenn man nämlich dem item einen korrekten Filenamen übergibt, dann kann man es auch sauber entpacken ("Kaum macht man's richtig, schon geht's"):
item.FileName := TargetFolder +item.PackedName; Alles in allem sieht das nun so aus:
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;
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz