Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi System.Zip Countfiles (https://www.delphipraxis.net/216423-system-zip-countfiles.html)

zeras 26. Dez 2024 18:45

System.Zip Countfiles
 
Ich möchte die Anzahl der Dateien in einer Zipdatei ermitteln, damit ich beim Auspacken den Fortschritt anzeige.
Leider gibt es Differenzen, wenn man die Datei mit 7Zip auspackt mit dem Explorer dann die Anzahl anzeigen läßt.
In dieser Funktion unten werden offenbar Datei und Verzeichnisse gezählt.
Ich habe aber keine Funktion gefunden, wo nur Dateien gezählt werden.
Hat jemand eine Idee?

Delphi-Quellcode:
  Result := 0;
  Zip := TZipFile.Create;
  try
    try
      Zip.Open(SrcfName, zmRead);
      result := Zip.FileCount;
      Zip.Close;

jaenicke 27. Dez 2024 06:01

AW: System.Zip Countfiles
 
Damit kannst du keine sinnvolle Fortschrittsanzeige machen, weil unterschiedlich große Dateien unterschiedlich lange dauern. Dafür gibt es das OnProgress-Event:
https://docwiki.embarcadero.com/Libr...ile.OnProgress

zeras 27. Dez 2024 10:20

AW: System.Zip Countfiles
 
Zitat:

Zitat von jaenicke (Beitrag 1544573)
Damit kannst du keine sinnvolle Fortschrittsanzeige machen, weil unterschiedlich große Dateien unterschiedlich lange dauern. Dafür gibt es das OnProgress-Event:
https://docwiki.embarcadero.com/Libr...ile.OnProgress

Danke für den Hinweis.
Am Ende möchte ich aber einen Vergleich machen, ob die Anzahl der extrahierten Dateien auch mit der Anzahl in der Zipdatei übereinstimmt. Dies ist für mehr Sicherheit.

jaenicke 27. Dez 2024 15:05

AW: System.Zip Countfiles
 
Zitat:

Zitat von zeras (Beitrag 1544575)
Am Ende möchte ich aber einen Vergleich machen, ob die Anzahl der extrahierten Dateien auch mit der Anzahl in der Zipdatei übereinstimmt. Dies ist für mehr Sicherheit.

Moment, aber du packst die Dateien doch selbst aus. Dabei kannst du selbst prüfen, ob die Dateien nach dem Entpacken da sind und du kannst auch prüfen, ob die Größe stimmt. Auch die Prüfsumme der Datei ist direkt abrufbar. Du kannst die Datei also auch nach dem Entpacken überprüfen.

Ansonsten kannst du nur beim Auspacken mitzählen. Einen Zähler für die Dateien gibt es meines Wissens nicht.

zeras 27. Dez 2024 16:57

AW: System.Zip Countfiles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich mache das so wie im Bild. Den Wert hinter "von" hole ich mir vorab von der Zipfunktion "Zip.FileCount". Am Ende sollte ja beispielsweise 999 von 999 sein.
Das angehängte Bild zeigt den Zustand, wo die Zipdatei komplett ausgepackt ist. Die Differenz zwischen links und rechts sind dann offenbar die Ordner. Jedenfalls zeigt es dann der Explorer so an.
Rechts davon habe ich eine Progressbar, was dann bei größeren Dateien den Fortschritt anzeigt.

zeras 1. Jan 2025 11:20

AW: System.Zip Countfiles
 
Ich habe das jetzt so zusammen mit ChatGPT gelöst und denke, dass dies auch in den Quellen bei Emba geändert werden sollte.
Wenn ich nach Dateien frage, dann möchte ich keine Pfade mitgezählt haben.

Delphi-Quellcode:
function GetCountFilesOfZipfilesNew(Srcfname: string): integer;
const
  IgnoredAttributes = faHidden + faSysFile + faDirectory;

var
  Zip: TZipFile;
  I: Integer;
  s: String;

begin
  Result := 0;

  Zip := TZipFile.Create;
  try
    try
      Zip.Open(SrcfName, zmRead);
      for I := 0 to Zip.FileCount - 1 do
      begin
        if (Zip.FileInfo[I].ExternalAttributes and IgnoredAttributes) = 0 then
          Inc(Result);
      end;
    except
      on E: EZipException do
        ShowMessage('Zip-Fehler: ' + E.Message);
      on E: EStreamError do
        ShowMessage('Stream-Fehler: ' + E.Message);
      on E: Exception do
        ShowMessage('Allgemeiner Fehler: ' + E.Message);
    end;
  finally
    Zip.Free;
  end;
end;

DeddyH 1. Jan 2025 17:09

AW: System.Zip Countfiles
 
Zitat:

Delphi-Quellcode:
const
  IgnoredAttributes = faHidden + faSysFile + faDirectory;

bitte ändern in
Delphi-Quellcode:
const
  IgnoredAttributes = faHidden or faSysFile or faDirectory;

zeras 1. Jan 2025 17:25

AW: System.Zip Countfiles
 
Zitat:

Zitat von DeddyH (Beitrag 1544685)
Zitat:

Delphi-Quellcode:
const
  IgnoredAttributes = faHidden + faSysFile + faDirectory;

bitte ändern in
Delphi-Quellcode:
const
  IgnoredAttributes = faHidden or faSysFile or faDirectory;

Danke für den Hinweis. Habe ich entsprechend geändert, nur frage ich mich, was der Unterschied ist. Der Compiler rechnet als Konstante in beiden Fällen "22" raus.

DeddyH 1. Jan 2025 17:42

AW: System.Zip Countfiles
 
Solange die zu kombinierenden Zahlen Potenzen von 2 sind und man sie garantiert nur einmal hinzufügt, gibt es auch kein Problem. Aber vergleich doch einmal
Delphi-Quellcode:
// faDirectory versehentlich doppelt
faHidden + faSysFile + faDirectory + faDirectory
mit
Delphi-Quellcode:
// faDirectory versehentlich doppelt
faHidden or faSysFile or faDirectory or faDirectory


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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