AGB  ·  Datenschutz  ·  Impressum  







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

System.Zip Countfiles

Ein Thema von zeras · begonnen am 26. Dez 2024 · letzter Beitrag vom 1. Jan 2025
Antwort Antwort
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.649 Beiträge
 
Delphi 12 Athens
 
#1

System.Zip Countfiles

  Alt 26. Dez 2024, 19:45
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;
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.659 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: System.Zip Countfiles

  Alt 27. Dez 2024, 07:01
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
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.649 Beiträge
 
Delphi 12 Athens
 
#3

AW: System.Zip Countfiles

  Alt 27. Dez 2024, 11:20
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.659 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: System.Zip Countfiles

  Alt 27. Dez 2024, 16:05
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.649 Beiträge
 
Delphi 12 Athens
 
#5

AW: System.Zip Countfiles

  Alt 27. Dez 2024, 17:57
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.
Miniaturansicht angehängter Grafiken
zaehler.png  
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.649 Beiträge
 
Delphi 12 Athens
 
#6

AW: System.Zip Countfiles

  Alt 1. Jan 2025, 12:20
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;
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.628 Beiträge
 
Delphi 12 Athens
 
#7

AW: System.Zip Countfiles

  Alt 1. Jan 2025, 18:09
Zitat:
Delphi-Quellcode:
const
  IgnoredAttributes = faHidden + faSysFile + faDirectory;
bitte ändern in
Delphi-Quellcode:
const
  IgnoredAttributes = faHidden or faSysFile or faDirectory;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.649 Beiträge
 
Delphi 12 Athens
 
#8

AW: System.Zip Countfiles

  Alt 1. Jan 2025, 18:25
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.628 Beiträge
 
Delphi 12 Athens
 
#9

AW: System.Zip Countfiles

  Alt 1. Jan 2025, 18:42
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 07:20 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 by Thomas Breitkreuz