Ce se intampla cu functiile standard de Delphi, cand se doreste aflarea marimii unui fisier de 2 GB si mai mare ?
FileSize e definita sa dea o valoare integer, adica pana la maxim 2147483647 bytes ($7FFFFFF) ... Daca se incearca folosirea campului Size din inregistrarea TSearchRec, e acelasi lucru, acest Size fiind definit tot integer.
Reamintesc ca 2147483647 bytes = ~2 GB (practic, lipseste un byte :D)
Totusi, in zilele noastre se pot gasi relativ usor fisiere cu marimi care sa intreaca aceasta limita. Bineinteles, rezultatele intoarse de functiile standard nu sunt de folos, in acest caz.
Rezolvarea, folosind API :)
function GetFileSizeHigh(aFileName: WideString): int64; overload;
var
aHandle : THandle;
aData : TWin32FindData;
aDataW : TWin32FindDataW;
begin
Result := 0;
try
aHandle := FindFirstFileW(PWideChar(aFileName), aDataW);
if aHandle <> INVALID_HANDLE_VALUE then
begin
Result := aDataW.nFileSizeHigh;
Result := Result shl 32;
Result := Result + aDataW.nFileSizeLow;
FindClose(aHandle);
end
else
begin
aHandle := FindFirstFile(PAnsiChar(AnsiString(aFileName)), aData);
if aHandle <> INVALID_HANDLE_VALUE then
begin
Result := aData.nFileSizeHigh;
Result := Result shl 32;
Result := Result + aData.nFileSizeLow;
FindClose(aHandle);
end;
end;
except
end;
end;Practic, marimea fisierului e returnata in 2 variabile pe 4 bytes (valoare maxima $FFFFFFFF). Variabila "high" e inmultita cu 2 la puterea 32 (adica, practic, sunt mutati spre stanga, cu 32 de pozitii, bitii valorii respective), valoare la care se aduna variabila "low" (pentru cei care nu inteleg la ce ma refer cu "low" si "high", faceti analogia cu AX = AH + AL).
Bafta