Ich habe meine Funktion jetzt angepasst. Maximaledateigröße 16 EiB minus 1 KiB. Laut Wikipedia die größte zulässige Dateigröße unter NTFS.
Die Funktion funktioniert soweit ganz gut und macht genau was ich brauche.
Delphi-Quellcode:
function CalculateSize(Bytes, Multiplier: UInt64): UInt64;
const
MaxSize: UInt64 = 18446744073709551615 - 1024; // 16 EiB - 1 KiB
var
dTmp: Double;
begin
if Multiplier > 0 then
dTmp := System.Math.Power(1024, Multiplier)
else
dTmp := 1;
dTmp := Bytes * dTmp;
if dTmp > MaxSize then
dTmp := MaxSize;
Result := Trunc(dTmp);
end;
Einen Integer-Overflow sollte es eigentlich wegen
if dTmp > MaxSize then dTmp := MaxSize;
nicht geben.
Statt Round, was Int64 erwartet, nehme ich jetzt Trunc. Damit sollte alles normalisiert werden.
Ok einen Overflow bekomme ich mit Round und Trunc trotzdem noch wenn dTmp = Maxsize ist.
Wenn ich MaxSize auf 1152921504606847000 (1 EiB) verkleinere, ist das Problem erledigt.
So lasse ich das jetzt auch. Denn ich denke niemand wird jemals eine Datei >1 EiB erzeugen. Und wenn, dann sind es Aliens.