![]() |
Zip-Archiv entpacken
Hallo.
Ich suche eine einfache Möglichkeit, ein Zip-Archiv zu entpacken. Nach Recherchieren im INet und im Forum habe ich alles verworfen. Das meiste ist uralt, anderes gibts nicht mehr, weil der Entwickler verstorben ist, manches ist kostenpflichig, und nochmal anderes ist mir zu aufwendig, oder ich kriege es nicht auf die Reihe. Das bisher geeignetste ist System.Zip.TZipFile.ExtractZipFile. Es ist in Delphi 10.3 schon enthalten und macht nur das eine, was ich brauche: Es entpackt eine Zip-Datei in einen Ziel-Ordner. Was ich bisher habe:
Delphi-Quellcode:
type
TForm1 = class(TForm) ... private { Private-Deklarationen } class procedure ShowZipProgress(Sender: TObject; FileName: string; Header: TZipHeader; Position: Int64);
Delphi-Quellcode:
Was unbedingt fehlt sind eine Möglichkeit das Ende des Entpack-Vorgangs zu erkennen, und eine Möglichkeit zum Abbrechen des Entpackvorgangs (z. B. weil es zu lange dauert).
implementation
{$R *.dfm} class procedure TForm1.ShowZipProgress(Sender: TObject; FileName: string; Header: TZipHeader; Position: Int64); begin // Show your progress here, whatever it needs to do ProgressBar1.Max := Header.UncompressedSize; // <== Edit - hatte ich vergessen. ProgressBar1.Position := Position; end; procedure TForm1.Button1Click(Sender: TObject); begin ProgressBar1.Max := 0; TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress); end; Was dazu könnte, wäre eine Progressanzeige. Das ProgressBar1.Position := Position; das ich verwende, funktioniert hierbei nicht. Es wird kein Gesamtfortschritt gezeigt, sondern für jede Datei einzeln. Die Progressbar flackert also ständig. Wichtig sind allerdings die beiden Punkte "Entpacken-Ende erkennen" und "Entpacken abbrechen". Hat jemand ein Code-Beispiel? Edit: Hinweis gefunden und oben eingefügt, dass vor die Event-Deklaration ein "class" gehört: class procedure ShowZipProgress(Sender: ... |
AW: Zip-Archiv entpacken
sorry, war falsch
|
AW: Zip-Archiv entpacken
Hallo,
hm sowas wie das hier ? You can get the progress of the current operation like this: PercentageOfCompletion := Position div Header.UncompressedSize; ( ![]() Und das Flackern kannst du doch selber beinflussen,
Delphi-Quellcode:
Dann wird alle 5% Entpackfortschritt der Balken weitergesetzt.
if PercentageOfCompletion mod 5 = then
begin Position:= PercentageOfCompletion; end; Da Du ja nur eine Datei entpackst, sollte das ja reichen. Zitat:
-> Ende des Entpackens ... PS: es gibt noch TZipMaster (benutze ich) und Abbrevia. |
AW: Zip-Archiv entpacken
Ohne groß zu probieren, vielleicht ist es ja tatsächlich so einfach:
Zitat:
Incocnito |
AW: Zip-Archiv entpacken
Delphi-Quellcode:
Gefunden in 10 Sekunden mit Google mit "ShowZipProgress delphi". Mit etwas mehr Eigeninitiative hättest du dein Problem selbst innerhalb kurzer Zeit lösen können. :roll:
procedure TForm16.OnZipProgressEvent(Sender: TObject; FileName: string;
Header: TZipHeader; Position: Int64); begin if PreviousFilename <> FileName then begin StaticText1.Caption := ExtractFileName(FileName); PreviousFilename := FileName; ProgressBar1.Position := 0; end else ProgressBar1.Position := (Position * 100) div Header.UncompressedSize ; Application.ProcessMessages; end; Btw. da Befehle nacheinander abgearbeitet werden, ist das Entpacken beendet, wenn
Delphi-Quellcode:
ausgeführt wurde. Also da nach. Es ist also eindeutig klar, wann das Entpacken fertig ist.
TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress);
|
AW: Zip-Archiv entpacken
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Zip-Archiv entpacken
Zitat:
Das Flackern kommt nicht von einem visuellen Darstellungs-Problem, sondern dadurch dass es für jede einzelne Datei ganz vorne anfängt und bis zum Ende der Progressbar läuft, dann fängt die nächste Datei wieder vorne an, und läuft bis ans Ende. Wenn ein Zip-Archiv z. B. 7.400 Dateien enthält, dann passiert das 7.400 mal ==> also flackerts. :wink: |
AW: Zip-Archiv entpacken
Zitat:
Richte deine Progress-bar Max dementsprechend aus. Es zwingt dich dann niemand immer wieder von vorne zu beginnen. |
AW: Zip-Archiv entpacken
Hallo,
ich kenne TZipFile ja nicht, aber Bekommst Du die Anzahl der Dateien raus ? Dann kannst Du ja Gesamt-Dateigrößen über property FileInfo[Index: Integer]: TZipHeader ermitteln. Ich habe aber keine FileCount gefunden, muss es aber doch geben, oder ? Danach kannst Du im ProgressEvent ja dann komplett hochzählen lassen, also eine eigene Variable, die mit Hilfe von Position hochzählt. PS: laut dem hier gibt es FileCount ![]() property FileCount: Integer; //total number of files in the zip file |
AW: Zip-Archiv entpacken
Woher soll ich wissen, was du schon probiert hast oder nicht?
Hättest du geschrieben: "Hier habe ich den und den Quellcode gefunden. Der funktioniert aber bei mir nicht. Es kommt die und die Fehlermeldung beim Kompilieren/Ausführen", dann hätte man zum einem gesehen, dass du dich schon selbst um das Problem gekümmert hast, das kommt immer gut an, und man hätte eine Grundlage für die weitere Hilfe gehabt. So hast du uns zwei Codeschnippsel gegeben und gesagt "ich will". Das hat bei mir etwas Unmut ausgelöst. Entschuldige bitte. Es flackert nicht, die Fortschrittsanzeige fängt nur für jede Datei von vorne an. Du willst aber anscheinend den Gesamtfortschritt. Dazu musst du die Endgröße ermitteln und den jeweiligen Einzelfortschritt merken und aufsummieren. Also noch etwas drumrum basteln. Es wird also vorher erforderlich sein vorher in einer Schleife die Größe aller Dateien zusammen zu ermitteln. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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