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?