Delphi-Quellcode:
function getFileSizeA(const FileName: string): Int64;
var
SR: TSearchRec;
begin
Result := 0;
if not FileExists(FileName) then
Exit;
if FindFirst(FileName, faAnyFile and not faDirectory, SR) = 0 then
try
Result := SR.Size;
finally
SysUtils.FindClose(SR)
end;
end;
Das kannst du anders machen. Mal unabhängig davon ob es Sinn macht FindFirst für jede einzelne Datei FindFirst neu zu bemühen, sowie SR.Size maximal eine 32 Bit Größe ausgibt (also alles über 2 GByte falsch wiedergibt), womit Int64 unnötig ist, ist in Code FileExists nicht nötig.
FindFirst sucht ja bereits nach dem Namen der Datei, findet es nicht, geht sie nicht in der Block rein (hier try finally), sondern übergeht ihn. Somit kann man sich die FileExists Abfrage sparen, sie kostet nur Zeit.
SR.Size gibt u. U. die falsche Dateigröße zurück, denn es ist Integer. Solange du unter 2 GByte bleibst, merkst du nichts. Die richtige Größe steckt in FindData. Hier die Formel:
Delphi-Quellcode:
x := Int64(SR.FindData.nFileSizeLow) or (Int64(SR.FindData.nFileSizeHigh) shl 32);
//
Ansonsten wird hier jede Datei anscheinend zwei mal angepackt - zuerst um den Namen zu lesen, später noch mal um die Größe zu erfahren. Dabei enthält TSearchRec schon beim ersten Zugriff alle Infos.