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

AW: Unzip mit der Shell32

  Alt 26. Mär 2014, 07: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.339 Beiträge
 
Delphi 12 Athens
 
#2

AW: Unzip mit der Shell32

  Alt 26. Mär 2014, 08: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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Mär 2014 um 08:20 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 28. Mär 2014, 10: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
 
#4

AW: Unzip mit der Shell32

  Alt 19. Nov 2014, 12: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 12: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 21:31 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