Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB (https://www.delphipraxis.net/210426-tzipfile-tzipprogressevent-position-fehler-bei-dateien-ueber-4gb.html)

bernau 22. Apr 2022 13:55

TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Ich teste grade TZipFile, weil ich Dateien >4GB komprimieren muss. Klappt soweit auch wunderbar.

Allerdings gibt es ein Problem wenn ich den Fortschritt anzeigen lassen möchte. Ich verwende das Event "OnProgress: TZipProgressEvent".

Im Parameter "Position" wird die aktuelle Position der grade zu komprimierenden Datei angegeben. Es gibt aber ein Problem ab 4,2GB, dann wird die Position wieder auf 0 gesetzt und zählt dort weiter.

Kann jemand den Fehler nachvollziehen?

Uwe Raabe 22. Apr 2022 14:02

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zeig mal etwas Code...

Rolf Frei 22. Apr 2022 14:09

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Wie zeigst du es an? Mit TProgressbar? Also beim TZipFile sehe ich auf die Schnelle keinen Grund wieso es da einen Integerüberlauf geben sollte, da dort mit Int64 gearbeitet wird. Ich würde deswegen eher auf deine Anzeigekomponente tippen, die eventuell nur Integerwerte nutzen kann. Dann wäre es wohl besser, wenn du da nur Prozentangaben zeigst.

bernau 22. Apr 2022 14:13

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1504975)
Zeig mal etwas Code...

Ich stelle mal was zusammen.

Uwe Raabe 22. Apr 2022 14:14

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von Rolf Frei (Beitrag 1504976)
Also beim TZipFile sehe ich auf die Schnelle keinen Grund wieso es da einen Integerüberlauf geben sollte, da dort mit Int64 gearbeitet wird.

Hatte ich auch erst vermutet, aber - TCustomZStream arbeitet intern nur mit 32-Bit (siehe total_out):
Delphi-Quellcode:
  z_stream = record
    next_in: PByte;     // next input byte
    avail_in: Cardinal; // number of bytes available at next_in
    total_in: LongWord; // total nb of input bytes read so far
    next_out: PByte;    // next output byte will go here
    avail_out: Cardinal; // remaining free space at next_out
    total_out: LongWord; // total nb of bytes output so far
    msg: MarshaledAString; // last error message, NULL if no error
    state: Pinternal_state; // not visible by applications
    zalloc: alloc_func; // used to allocate the internal state
    zfree: free_func;   // used to free the internal state
    opaque: Pointer;    // private data object passed to zalloc and zfree
    data_type: Integer; // best guess about the data type: binary or text
                         // for deflate, or the decoding state for inflate
    adler: LongWord;    // Adler-32 or CRC-32 value of the uncompressed data
    reserved: LongWord; // reserved for future use
  end;

bernau 22. Apr 2022 14:15

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von Rolf Frei (Beitrag 1504976)
Wie zeigst du es an? Mit TProgressbar? Also beim TZipFile sehe ich auf die Schnelle keinen Grund wieso es da einen Integerüberlauf geben sollte, da dort mit Int64 gearbeitet wird. Ich würde deswegen eher auf deine Anzeigekomponente tippen, die eventuell nur Integerwerte nutzen kann. Dann wäre es wohl besser, wenn du da nur Prozentangaben zeigst.

Ich zeige den Wert von Position

Delphi-Quellcode:
procedure Form1.ZipProgressEvent(aSender: TObject; aFileName: string; aHeader: TZipHeader; aPosition: Int64);
begin
  LabelPosition.caption := aPosition.ToString;
end;

Uwe Raabe 22. Apr 2022 14:25

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von bernau (Beitrag 1504979)
Ich zeige den Wert von Position

Genau. Und Position wird über ein
Delphi-Quellcode:
Seek(0, soCurrent)
ermittelt, was in TZCompressionStream das total_in und in TZDecompressionStream das total_out liefert. Das sind aber nur 32-Bit Werte.

bernau 22. Apr 2022 14:29

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1504978)
TCustomZStream arbeitet intern nur mit 32-Bit (siehe total_out):

Das wird es wohl sein. Dann kann ich mir das Beispiel ja sparen ;-)

Der Bereich von LongWord (0 .. 4294967295) passt ja zu den 4,2 GB.

Nun ja. Solange die ZIP-Datei nicht fehlerhaft ist, kann ich noch damit leben. Den Progress kann ich wohl mit ein paar Tricks umschiffen.

Uwe Raabe 22. Apr 2022 14:31

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Kannst du trotzdem bitte einen QP-Report erstellen? Immerhin wirbt Delphi 11 ja mit Zip64-Support.

bernau 22. Apr 2022 14:45

AW: TZipFile -> TZipProgressEvent -> Position -> Fehler bei Dateien über 4GB
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1504983)
Kannst du trotzdem bitte einen QP-Report erstellen? Immerhin wirbt Delphi 11 ja mit Zip64-Support.

https://quality.embarcadero.com/browse/RSP-38036

Ist das so verständlich? (Mein erster QP-Report :oops: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 Uhr.
Seite 1 von 2  1 2      

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