Tutoriale Linux, Tutoriale Programare, Tutoriale retele, tutoriale photoshop

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 :)

Cod:

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

Ethical hacking and programming community