AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unzip mit der Shell32

Ein Thema von Gerd01 · begonnen am 25. Mär 2014 · letzter Beitrag vom 19. Nov 2014
Antwort Antwort
Gerd01

Registriert seit: 18. Mär 2005
Ort: NRW
117 Beiträge
 
Delphi XE2 Professional
 
#1

Unzip mit der Shell32

  Alt 25. Mär 2014, 17:19
Es gibt eine elegante Mögichkeit mit der Shell32 ein Zipfile zu entpacken. Mein Quelltext hierfür ist dieser:

Delphi-Quellcode:
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;
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.

Gibt es eine Option oder Möglichkeit die Pfadangaben in den gepackten auszublenden, sodass ich die reinen Dateien im Zielordner habe?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Unzip mit der Shell32

  Alt 25. Mär 2014, 17:27
Man könnte natürlich mal auf eine total verrückt Idee kommen und in die Dokumentation schauen.
http://msdn.microsoft.com/en-us/libr.../bb787866.aspx

Und nein.
Zitat von siehe Abschnitt in der Doku:
Note In some cases, such as compressed (.zip) files, some option flags may be ignored by design.
Oder ja, wenn du dann nochmal umkopierst.




Zitat:
Keine direkte Zuweisung ...
Warum eigentlich?

Und wo wird das Result gesetzt?
$2B or not $2B

Geändert von himitsu (25. Mär 2014 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Gerd01

Registriert seit: 18. Mär 2005
Ort: NRW
117 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Unzip mit der Shell32

  Alt 26. Mär 2014, 08:34
Vielen Dank für den Hinweis auf die Dokumentation, da hatte ich allerdings schon nachgelesen.

Diese Hinweise mit zum Beispiel folgender Bemerkung:
Zitat:
Man könnte natürlich mal auf eine total verrückt Idee kommen und in die Dokumentation schauen
Einfach nur der Hinweis reicht.

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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unzip mit der Shell32

  Alt 26. Mär 2014, 09:14
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.

Vielen Dank für den Hinweis auf die Dokumentation, da hatte ich allerdings schon nachgelesen.
Wenn das CopyHere für ZIPs das nunmal nicht direkt bietet, dann geht es einfach nicht.
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.
$2B or not $2B

Geändert von himitsu (26. Mär 2014 um 09:20 Uhr)
  Mit Zitat antworten Zitat
Gerd01

Registriert seit: 18. Mär 2005
Ort: NRW
117 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Unzip mit der Shell32

  Alt 28. Mär 2014, 11:25
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;
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Unzip mit der Shell32

  Alt 19. Nov 2014, 13:14
Hallo,

dem Code lässt sich entnehmen, dass man mit
Code:
...
      FileList.Add(shellfldritems.item(I).path);
auf die einzelnen Items (= Dateien) zumindest "lesend" zugreifen kann.

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:
 /// 25.03.2014 17:07 -> Keine direkte Zuweisung von ZipFile an shellobj.NameSpace(...
  ZipFileV := ZipFile;
  srcfldr := shellobj.NameSpace(zipfileV);
z.B.
  srcfldr := shellobj.NameSpace(OleVariant(zipfile)); [/edit]
Alex Winzer

Geändert von Schwedenbitter (19. Nov 2014 um 13:18 Uhr) Grund: Vergesslichkeit
  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 02:36 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