![]() |
Unzip mit der Shell32
Es gibt eine elegante Mögichkeit mit der Shell32 ein Zipfile zu entpacken. Mein Quelltext hierfür ist dieser:
Delphi-Quellcode:
Nun aber mein Problem. Die zu entpackende files in der ZIP sind mit vollständigen Pfad gepackt. Wenn ich also die zip entpacke sind die entpackten Dateien nicht direkt im Zielordner sondern mit Pfad im Zielordner abgespeichert.
const
SHCONTCH_NOPROGRESSBOX = 4; SHCONTCH_AUTORENAME = 8; SHCONTCH_RESPONDYESTOALL = 16; SHCONTF_INCLUDEHIDDEN = 128; SHCONTF_FOLDERS = 32; SHCONTF_NONFOLDERS = 64; function ShellUnzip(zipfile, targetfolder: string; filter: string = '*.*'): boolean; var shellobj: olevariant; srcfldr, destfldr: olevariant; shellfldritems: olevariant; FilterV, ZipFileV, TargetFldrV: Variant; begin shellobj := CreateOleObject('Shell.Application'); /// 25.03.2014 17:07 -> Keine direkte Zuweisung von ZipFile an shellobj.NameSpace(... ZipFileV := ZipFile; srcfldr := shellobj.NameSpace(zipfileV); /// 25.03.2014 17:07 -> dito TargetFldrV := targetfolder; destfldr := shellobj.NameSpace(TargetFldrV); shellfldritems := srcfldr.Items; /// 25.03.2014 17:07 -> dito FilterV := Filter; if (filter <> '') then shellfldritems.Filter(SHCONTF_INCLUDEHIDDEN or SHCONTF_NONFOLDERS,filterV); destfldr.CopyHere(shellfldritems,SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); end; Gibt es eine Option oder Möglichkeit die Pfadangaben in den gepackten auszublenden, sodass ich die reinen Dateien im Zielordner habe? |
AW: Unzip mit der Shell32
Man könnte natürlich mal auf eine total verrückt Idee kommen und in die Dokumentation schauen. :stupid:
![]() Und nein. Zitat:
Zitat:
Und wo wird das Result gesetzt? |
AW: Unzip mit der Shell32
Vielen Dank für den Hinweis auf die Dokumentation, da hatte ich allerdings schon nachgelesen.
Diese Hinweise mit zum Beispiel folgender Bemerkung: Zitat:
Eine NameSpace mit einem string-Typ crasht, es wird ein varianter Typ erwartet. Um umkopieren zu können, müsste ich die Inhalte (Dateien) der ZIP kennen. Hast jemand eine Idee? |
AW: Unzip mit der Shell32
Den ZIP-Inhalt inkl. Unterverzeichnisse rauskopieren (eventuell in ein Temp-Verzeipchnis) und von da dann ohne Verzeichnisstruktur ins Zielverzeichnis, wofür es ja scheinbar eine Option gibt.
Oder du listest über srcfldr die Dateien und Verzeichnisse auf und kopierst Dateien einzeln, bzw. jeweils alle Dateien der Vereichnisse (ohne Unterverzeichne). Wie, sollte in der Doku stehen, denn das weiß ich nun auch nicht. Zitat:
Aber das hätte man ja sehen können, wo es doch ganz deutlich in der Doku erwähnt wird. Und ansonsten kann man immernoch eine der vielen ZIP-Komponenten verwenden, die es auch noch gibt. |
AW: Unzip mit der Shell32
Für den, den es interssiert, hier nochmal der Code mit der Übergabe der entpackten Dateiliste incl. Verzeichnisangabe:
Code:
const
SHCONTCH_NOPROGRESSBOX = 4; SHCONTCH_AUTORENAME = 8; SHCONTCH_RESPONDYESTOALL = 16; SHCONTF_INCLUDEHIDDEN = 128; SHCONTF_FOLDERS = 32; SHCONTF_NONFOLDERS = 64; function ShellUnzip(zipfile, targetfolder: string; FileList : TStringList; Const filter: string = ''): boolean; var shellobj: olevariant; srcfldr, destfldr: olevariant; shellfldritems: olevariant; FilterV, ZipFileV, TargetFldrV: OleVariant; I:Integer; begin shellobj := CreateOleObject('Shell.Application'); /// 25.03.2014 17:07 -> Keine direkte Zuweisung von ZipFile an shellobj.NameSpace(... ZipFileV := ZipFile; srcfldr := shellobj.NameSpace(zipfileV); /// 25.03.2014 17:07 -> dito ForceDirectories(PChar(targetfolder)); TargetFldrV := targetfolder; destfldr := shellobj.NameSpace(TargetFldrV); shellfldritems := srcfldr.Items; /// 25.03.2014 17:07 -> dito FilterV := Filter; if (filter <> '') then shellfldritems.Filter(SHCONTF_INCLUDEHIDDEN or SHCONTF_NONFOLDERS,filterV); destfldr.CopyHere(shellfldritems,SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); if Assigned(FileList) then Begin FileList.Clear; for I := 0 to shellfldritems.Count -1 do FileList.Add(shellfldritems.item(I).path); end; end; |
AW: Unzip mit der Shell32
Hallo,
dem Code lässt sich entnehmen, dass man mit Zitat:
Gibt es eine Möglichkeit, dem zip-Entpacker mitzugeben, welche Dateien er entpacken soll? Das geht zwar wohl vom Ansatz her mit Filter. Aber ich möchte z.B. die 3. und 26. Datei entpacken und die heißen z.B. "abc.de" und "fghi.jklm". Die Dateien einzeln auszupacken, dauert mir zu lang, weil allein schon das Öffnen des Shell-Fensters Ewigkeiten braucht. Es muss irgendwie funktionieren, weil es Windows selbst auch kann (wenn ich die Datei als Folder öffne, 2 Dateien markiere und auf entpacken klicke oder woanders hin kopiere...). Wo kann man/ich dazu etwas finden? [edit] Man kann das meines Erachtens eleganter machen über das Casten. Also statt
Delphi-Quellcode:
z.B.
/// 25.03.2014 17:07 -> Keine direkte Zuweisung von ZipFile an shellobj.NameSpace(...
ZipFileV := ZipFile; srcfldr := shellobj.NameSpace(zipfileV);
Delphi-Quellcode:
[/edit]
srcfldr := shellobj.NameSpace(OleVariant(zipfile));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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