Um die Größe einer beliebigen (z.B. binären) Datei zu ermitteln gibt es zwei gute Wege:
- Diesen Weg postete Luckie in diesem Beitrag.
Hierbei nimmt man sich die WinAPI zu Hilfe:
Delphi-Quellcode:
function GetFileSize(const szFile: String): Int64;
var
fFile: THandle;
wfd: TWIN32FINDDATA;
begin
result := 0;
if not FileExists(szFile) then exit;
fFile := FindFirstfile(pchar(szFile),wfd);
if fFile = INVALID_HANDLE_VALUE then exit;
result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
windows.FindClose(fFile);
end;
(Korrigierte Version (100% nonVCL-Kompatibel) von Luckie: hier (s.u.))
- Ein anderer wäre die Datei in einen Stream zu laden:
Delphi-Quellcode:
function GetFileSize(const FileName: string): Int64;
var
FileStream: TFileStream;
begin
FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
try
Result := FileStream.Size;
except
Result := 0;
end;
finally
FileStream.Free;
end;
end;
- Zwei weitere Möglichkeiten kommen von SirThornberry:
Delphi-Quellcode:
function GetFileSize(AFileName: String): Int64;
var lFindData: TWin32FindData;
lHandle : Cardinal;
begin
lHandle := FindFirstFile(PChar(AFileName), lFindData);
if (lHandle <> INVALID_HANDLE_VALUE) then
begin
result := lFindData.nFileSizeLow;
PCardinal(Cardinal(@result) + SizeOf(Cardinal))^ := lFindData.nFileSizeHigh;
windows.FindClose(lHandle);
end
else
result := 0;
end;
Delphi-Quellcode:
function GetFileSize(AFileName: String): Int64;
type
TInt64 = packed record
Low : Cardinal;
High: Cardinal;
end;
var lFindData: TWin32FindData;
lHandle : Cardinal;
lGiveback: TInt64;
begin
lHandle := FindFirstFile(PChar(AFileName), lFindData);
if (lHandle <> INVALID_HANDLE_VALUE) then
begin
lGiveback.Low := lFindData.nFileSizeLow;
lGiveback.High := lFindData.nFileSizeHigh;
windows.FindClose(lHandle);
result := Int64(lGiveback);
end
else
result := 0;
end;
- shmia stellt noch eine weitere Möglichkeit vor
Delphi-Quellcode:
function GetFileSize(const AFileName: string): Int64;
var
SearchRec: TSearchRec;
OldMode: Cardinal;
Size: TULargeInteger;
begin
Result := -1;
OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
if FindFirst(AFileName, faAnyFile, SearchRec) = 0 then
begin
Size.LowPart := SearchRec.FindData.nFileSizeLow;
Size.HighPart := SearchRec.FindData.nFileSizeHigh;
Result := Size.QuadPart;
SysUtils.FindClose(SearchRec);
end;
finally
SetErrorMode(OldMode);
end;
end;
Diese Funktion funktioniert auch dann, wenn die Datei exclusiv von einem anderen Prozess geöffnet wurde.
Die zweite Möglichkeit ist zwar eindeutig schneller zu schreiben und kann auch mit sehr großen Dateien umgehen (allerdings auch erst seit Delphi 6), ist jedoch nicht für die
nonVCL-Programmierung geeignet.
Chris
[edit=fkerber]Neu gespeichert wg. Code-Highlighting, Mfg, fkerber[/edit]
[edit=Chakotay1308]Fehler bei (2) korrigiert und zwei neue Möglichkeiten eingefügt. Mfg, Chakotay1308[/edit]
[edit=fkerber] Mfg, fkerber[/edit]