AGB  ·  Datenschutz  ·  Impressum  







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

Zip-Archiv entpacken

Ein Thema von Guido Eisenbeis · begonnen am 9. Jan 2020 · letzter Beitrag vom 13. Jan 2020
Antwort Antwort
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#1

Zip-Archiv entpacken

  Alt 9. Jan 2020, 14:32
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:
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 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).

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: ...

Geändert von Guido Eisenbeis (10. Jan 2020 um 01:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 14:45
sorry, war falsch
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 15:01
Hallo,
hm

sowas wie das hier ?

You can get the progress of the current operation like this:
PercentageOfCompletion := Position div Header.UncompressedSize;

(http://docwiki.embarcadero.com/Libra...pProgressEvent)

Und das Flackern kannst du doch selber beinflussen,
Delphi-Quellcode:
if PercentageOfCompletion mod 5 = then
begin
  Position:= PercentageOfCompletion;
end;
Dann wird alle 5% Entpackfortschritt der Balken weitergesetzt.
Da Du ja nur eine Datei entpackst, sollte das ja reichen.


Zitat:
Was unbedingt fehlt sind eine Möglichkeit das Ende des Entpack-Vorgangs zu erkennen
TZipFile.ExtractZipFile('F:\1\Test.zip', ['F:\1\2\', ShowZipProgress);
-> Ende des Entpackens ...


PS:
es gibt noch TZipMaster (benutze ich) und Abbrevia.
Heiko

Geändert von hoika ( 9. Jan 2020 um 15:36 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#4

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 15:05
Ohne groß zu probieren, vielleicht ist es ja tatsächlich so einfach:
...
Delphi-Quellcode:
...
procedure TForm1.ShowZipProgress(Sender: TObject; FileName: string;
  Header: TZipHeader; Position: Int64);
begin
  // Show your progress here, whatever it needs to do

  if (ProgressBar1.Max = 0) then ProgressBar1.Max := Header.UncompressedSize;

  ProgressBar1.Position := Position;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  ProgressBar1.Max := 0;
  TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress);
  ShowMessage('Fertig!');// <- Ist der hier nicht fertig?
end;
...
Liebe Grüße
Incocnito

Geändert von Incocnito ( 9. Jan 2020 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 15:23
Delphi-Quellcode:
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;
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.

Btw. da Befehle nacheinander abgearbeitet werden, ist das Entpacken beendet, wenn
TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress); ausgeführt wurde. Also da nach. Es ist also eindeutig klar, wann das Entpacken fertig ist.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 9. Jan 2020 um 15:28 Uhr)
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 16:07
Mit etwas mehr Eigeninitiative hättest du dein Problem selbst innerhalb kurzer Zeit lösen können.
Würdest du das bitte unterlassen? Das ist nicht hilfreich und du weißt doch gar nicht, wieviel Eigeninitiative ich schon reingesteckt habe!

Gefunden in 10 Sekunden mit Google mit "ShowZipProgress delphi".
Mehr ist es auch nicht wert, denn es funktioniert nicht! Zudem finde ich es auch herablassend, wie du mit mir sprichst. Irgendwer hat dir wohl weh getan, dass du so zornig bist. Aber ich war das nicht!

TZipFile.ExtractZipFile('F:\1\Test.zip', ['F:\1\2\', ShowZipProgress);
-> Ende des Entpackens ...
Ohne groß zu probieren, vielleicht ist es ja tatsächlich so einfach:
Delphi-Quellcode:
  TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress);
  ShowMessage('Fertig!');// <- Ist der hier nicht fertig?
Btw. da Befehle nacheinander abgearbeitet werden, ist das Entpacken beendet, wenn
TZipFile.ExtractZipFile('F:\1\Test.zip', 'F:\1\2\', ShowZipProgress); ausgeführt wurde. Also da nach. Es ist also eindeutig klar, wann das Entpacken fertig ist.
Da war ich wohl blind, denn ihr habt alle Recht! 1 Problem gelöst! Vielen Dank!
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Zip-Archiv entpacken

  Alt 9. Jan 2020, 16:24
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.
Folgende Infos zum Flackern der Progressanzeige:

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.
  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 01:16 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