![]() |
TWin32FindData: Dateigröße bestimmen
Entweder bin ich blind oder doof.
Ich habe eine Prozedur die ein Verzeichnis mit Dateien durchläuft. Das alles geht über TWin32FindData. Nun wird mir bei einer 15,6 GB großen ZIP-Datei mit folgender Zeile 3,69 GB ausgegeben:
Delphi-Quellcode:
Ist die Berechnung falsch?
Groesse := (wfd.nFileSizeHigh * (MAXDWORD)) + wfd.nFileSizeLow;
|
AW: TWin32FindData: Dateigröße bestimmen
Zitat:
Probiere es mal so:
Delphi-Quellcode:
var
Groesse: Int64; Groesse := Int64(wfd.nFileSizeHigh) shl 32 + wfd.nFileSizeLow; |
AW: TWin32FindData: Dateigröße bestimmen
Resultat: 15,69 GB - exakt.
Ich muss mir deine Lösung gleich mal in Ruhe angucken, damit ich sie auch verstehe. Habe eben auch schon gelesen, dass es ein Limit von 4 GB irgendwo gibt. Ich bedanke mich! Und ich gucke mir das gleich mal in Ruhe an. |
AW: TWin32FindData: Dateigröße bestimmen
Zitat:
Delphi erweitert Typen automatisch nur auf 32 Bit, solange alle Typen maximal 32 Bit sind, mit dem selben Vorzeichen (SIGNED- und UNSIGNED-Typen) Das macht der Compiler aus deinem Code:
Delphi-Quellcode:
Groesse := (LongWord(wfd.nFileSizeHigh) * LongWord(MAXDWORD)) + LongWord(wfd.nFileSizeLow);
Aber du willst ja eher
Delphi-Quellcode:
Groesse := (UInt64(wfd.nFileSizeHigh) * LongWord(MAXDWORD)) + LongWord(wfd.nFileSizeLow);
[edit] Natürlich auch das MAXDWORD+1 beachten ... siehe Vorredner Oder besser noch
Delphi-Quellcode:
Groesse := (UInt64(wfd.nFileSizeHigh) shl 32) or wfd.nFileSizeLow;
Int64 oder UInt64, jenachdem wie
Delphi-Quellcode:
deklariert ist (aber es sollte natürlich eher UInt64 sein)
Groesse
PS: In deinem Fall hättest du den Typ-Fehler sofort gefunden, wenn du in den Projektoptionen einmal die Bereichsprüfung Überlaufprüfung aktiviert hättest. PS2: Man könnte auch Casten, statt rechnen/schieben -> Int64Rec oder LARGE_INTEGER |
AW: TWin32FindData: Dateigröße bestimmen
Stupide Frage :P
Ist es sinnvoll da wo es sinnvoll ist, UInt64 statt Int64 zu verwenden? Habe immer ein bisschen Angst, dass wenn ich UInt64 verwende unvorhergesehen trotzdem ein Wert <0 rauskommt und es dann zu einer AV oder Ähnlichem kommt (da UInt64 deklariert statt Int64). |
AW: TWin32FindData: Dateigröße bestimmen
Wenn eine Dateigröße negativ ist, dann stimmt an einer ganz anderen Stelle schon was nicht. :?
|
AW: TWin32FindData: Dateigröße bestimmen
Das bedeutet, das kann eigentlich gar nicht passieren? Würde mich auch schwer wundern.
|
AW: TWin32FindData: Dateigröße bestimmen
Zitat:
Aber früher gab es auch keine Probleme, wenn jemand Pointer zu Integer castete, dazumal damals schon Cardinal richtiger gewesen wäre, aber es jetzt ja eigentlich NativeUInt wäre. |
AW: TWin32FindData: Dateigröße bestimmen
Zitat:
Und durch die ganzen Cardinals im VirtualTreeView war man nur am Rum-casten, damit der Compiler keine "unsigned mit signed Integer-Vergleich" Warnungen ausspuckte. Deswegen verzichte ich normalerweise auf UInt64/Cardinal, wenn es sich nicht um interne Daten handelt, die von außen (andere Entwickler) zugegriffen werden, oder wenn ich am Schluss einen DWORD oder UINT WinAPI Parameter habe. |
AW: TWin32FindData: Dateigröße bestimmen
Zitat:
Spaß bei Seite. Bevor ich irgendwo Dateien mit einer Gesamtgröße von 9,22 EB habe, brauche ich tausende Euros, um die Festplatte dafür zu kaufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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