Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zip-Archiv entpacken (https://www.delphipraxis.net/203066-zip-archiv-entpacken.html)

venice2 9. Jan 2020 17:32

AW: Zip-Archiv entpacken
 
Nun denn!

Delphi-Quellcode:
var
  zipFile: TZipFile;
  fileCount: Integer;
  filename: string;
begin
  zipFile := TZipFile.Create;
  filename := 'xxx'
  zipFile.Open(filename, zmRead);
  fileCount := zipFile.FileCount;
end;

Guido Eisenbeis 10. Jan 2020 03:26

AW: Zip-Archiv entpacken
 
Zitat:

Zitat von Luckie (Beitrag 1454787)
So hast du uns zwei Codeschnippsel gegeben und gesagt "ich will". Das hat bei mir etwas Unmut ausgelöst. Entschuldige bitte.

Vielen Dank! :-D

Wir "kennen" uns schon seit über 10 Jahren, bei mir kannst du davon ausgehen, dass ich mich vor dem Posten intensiv bemüht habe, Lösungen selbst zu finden. :wink:


Zurück zum Thema "Entpacken eines Zip-Archivs"

Dank eurer Hilfe habe ich nun eine Lösung zusammengestellt, mit der ein Zip-Archiv in einen Zielordner entpackt werden kann. Dabei ist eine Fortschrittsanzeige möglich und das Ende des Vorgangs kann festgestellt werden. Und das alles ohne zusätzliche Komponenten, nur mit Delphi internen Möglichkeiten! :thumb:

Besonderer Dank geht an hoika! Dein Link hat mir den Anfang ermöglicht. Native Zip file support in Delphi XE2 Damit hatte ich Informationen zum Erstellen eines TZipFile-Objekts, und mit den Anweisungen im try-finally Block konnte ich sehen, wie und was wieder freigegeben werden muss. :thumb:

Information am Rande: zipFile.FileCount gibt einen höheren Wert aus, als ein Datei-Zähler beim Auspacken des Zip-Archivs. Das wird im Moment zwar nicht benötigt, aber interessant wäre es, warum das so ist. Meine Vermutung ist, dass zipFile.FileCount die Ordner im Zip-Archiv mitzählt.

Somit sind 2 von 3 Problemen gelöst. Fehlt nur noch die Möglichkeit zum Abbrechen eines laufenden Entpack-Vorganges. Ideen? :idea:

Luckie 10. Jan 2020 04:20

AW: Zip-Archiv entpacken
 
Und wie sieht dein Code jetzt aus?

Abbrechen müsste in dem Fortschrittsereignis möglich sein.

PS: Wir kennen uns seit 10 Jahren? :shock: Hattest du mal einen anderen Benutzernamen?

Guido Eisenbeis 10. Jan 2020 04:49

AW: Zip-Archiv entpacken
 
Zitat:

Zitat von Luckie (Beitrag 1454823)
Und wie sieht dein Code jetzt aus?

Ziemlich durcheinander. Ich räume gerade darin auf. Wenn es jemand interessiert, kann ich das Ergebnis gerne posten.

Zitat:

Zitat von Luckie (Beitrag 1454823)
Abbrechen müsste in dem Fortschrittsereignis möglich sein.

Das scheint mir der richtige Platz zu sein, aber wie kann man das bewerkstelligen? :gruebel:

Zitat:

Zitat von Luckie (Beitrag 1454823)
PS: Wir kennen uns seit 10 Jahren? :shock: Hattest du mal einen anderen Benutzernamen?

Damals nicht. :) "Kennen" in Anführungszeichen meint, dass du eine schillernde Person der Öffentlichkeit warst / bist (= VIP) und ich in jedem zweiten Code-Snippet deinen Namen gefunden habe. Ich selbst bin wohl so unbedeutend, dass du dich nicht erinnern kannst. :cry:

Luckie 10. Jan 2020 07:21

AW: Zip-Archiv entpacken
 
Hat die Klasse eine Eigenschaft zum Abbrechen? Dann einfach im Progress-Eventhandler:
Delphi-Quellcode:
if bAbort then zipFile.Abort
Oder wie auch immer die Eigenschaft heißt.

hoika 10. Jan 2020 07:32

AW: Zip-Archiv entpacken
 
Hallo,
im ProgressEvent einfach eine Exception erzeugen?

Delphi-Quellcode:
procedure TForm1.OnZipProgress();
begin
  Application.ProcessMe3ssages; // wichtig

  if bAbort then
  begin
    Exception.Create('');
  end;
end;


// Button "Abbrechen"-Klick Methode
procedure TForm1.OnBtnCancelClick;
begin
  bAbort:= True;
end;

procedure TForm1.Entpacke;
begin
  ...
  try
    Zipfile.Extract ...
  except
  end;
end;

Guido Eisenbeis 10. Jan 2020 07:43

AW: Zip-Archiv entpacken
 
Zitat:

Zitat von Luckie (Beitrag 1454837)
Hat die Klasse eine Eigenschaft zum Abbrechen? Dann einfach im Progress-Eventhandler:
Delphi-Quellcode:
if bAbort then zipFile.Abort

Ich habe den Thread erstellt, um ebendiese Information zu bekommen. Weiß jemand, wie man das macht? Gesucht habe ich danach in der Klasse TZipFile, TZipFile.FileInfo und TZipHeader. Leider erfolglos, ein Abort habe ich nicht gefunden. Es gibt ein Close, aber ob das so gut ist, mittendrin einfach zu schließen!? Zudem steht zu der Pozedur in der Hilfe: Dateien können aus einem Archiv ohne Instantiierung von TZipFile-Objekten mit der Klassenprozedur ExtractZipFile extrahiert werden.

Hat jemand eine Idee?

Incocnito 10. Jan 2020 14:45

AW: Zip-Archiv entpacken
 
Ein kurzer Blick in System.zip ...
ExtractZipFile ist übersichtlich, das "magische" passiert wiederum in "extractall" ...
Auch diese ist übersichtlich und beinhaltet eine Schleife über alle Dateien.
Hier fehlt schon die Option zum Abbrechen ...
Im Wesentlichen ruft "ExtractAll" also "Extract" in einer Schleife auf.
Hier wird dann die komplette Datei "in einem Rutsch" in einen Stream geladen,
danach beschäftigt sich die Funktion im Wesentlichen darum die passende Datei (TFileStream)
anzulegen. Anschließend wird "OnProgress" aufgerufen. Da ist das aber alles schon vorbei.
Ich würde sagen, mit "Syste.Zip.TZipFile.ExtractZipFile" ist ein Abbrechen nicht möglich.

Nächster Versuch wäre "System.ZLib", aber die ist etwas größer als dass ich da eine Aussage treffen würde.
Spontan habe ich nichts mit Abbrechen-Funktion gefunden, aber wie gesagt, sicher kann ich das nicht sagen.

Liebe Grüße
Incocnito

Guido Eisenbeis 12. Jan 2020 15:27

AW: Zip-Archiv entpacken
 
Zitat:

Zitat von hoika (Beitrag 1454838)
im ProgressEvent einfach eine Exception erzeugen?[/DELPHI]

Interessanter Gedanke. Mit welchen Auswirkungen ist denn im schlimmsten Fall zu rechnen?

Zitat:

Zitat von Incocnito (Beitrag 1454873)
Im Wesentlichen ruft "ExtractAll" also "Extract" in einer Schleife auf.
...
Ich würde sagen, mit "Syste.Zip.TZipFile.ExtractZipFile" ist ein Abbrechen nicht möglich.

Sieht so aus. Danke für eure Antworten!

zeras 12. Jan 2020 15:51

AW: Zip-Archiv entpacken
 
Da wir schon beim Entzippen sind. Kann das nun integrierte Zippen/Entzippen auch in einen Stream entzippen?
Ich habe noch Delphizip im Einsatz. Dort steht aber, das die aus Gesundheitsgründen nicht mehr weiterentwicklelt wird.
Daher suche ich nach einer Alternative in Zukunft. Wenn das schon in Delphi integriert ist, wäre das meines Erachtens die beste Alternative.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Seite 2 von 3     12 3      

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