A seguir temos 3 funções que retornam o tamanho de um arquivo. A primeira não é adequada para arquivos grandes, pois o retorno está limitado a um inteiro de 32 bits com sinal, cujo valor máximo é 2.147.483.647. As outras duas funções trabalham corretamente com arquivos grandes, pois o retorno é um número inteiro de 64 bits.
function TamanhoArquivo1(const Arquivo: string): Integer; var SR: TSearchRec; begin if SysUtils.FindFirst(Arquivo, faAnyFile, SR) = 0 then try Result := SR.Size; finally SysUtils.FindClose(SR); end; end; function TamanhoArquivo2(const Arquivo: string): Int64; var FileHandle: Integer; FileSizeLo, FileSizeHi: DWORD; begin FileHandle := FileOpen(Arquivo, fmOpenRead); if FileHandle < 0 then RaiseLastOSError; try FileSizeLo := GetFileSize(FileHandle, @FileSizeHi); Int64Rec(Result).Lo := FileSizeLo; Int64Rec(Result).Hi := FileSizeHi; finally FileClose(FileHandle); end; end; function GetFileSizeEx(hFile: THandle; var FileSize: Int64): BOOL; stdcall; external kernel32; function TamanhoArquivo3(const Arquivo: string): Int64; var FileHandle: Integer; begin FileHandle := FileOpen(Arquivo, fmOpenRead); if FileHandle < 0 then RaiseLastOSError; try if not GetFileSizeEx(FileHandle, Result) then RaiseLastOSError; finally FileClose(FileHandle); end; end;
Para testar:
procedure TForm1.Button1Click(Sender: TObject); var Arquivo: string; Tamanho1, Tamanho2, Tamanho3: Int64; begin Arquivo := 'C:\Tecnobyte\SAC_Plus\SAC.exe'; Tamanho1 := TamanhoArquivo1(Arquivo); Tamanho2 := TamanhoArquivo2(Arquivo); Tamanho3 := TamanhoArquivo3(Arquivo); ShowMessage( 'Arquivo: ' + Arquivo + #13'Tamanho1: ' + FormatFloat('#,##0', Tamanho1) + ' bytes' + #13'Tamanho2: ' + FormatFloat('#,##0', Tamanho2) + ' bytes' + #13'Tamanho3: ' + FormatFloat('#,##0', Tamanho3) + ' bytes'); end;
O conteúdo desta página pode ajudar alguém? Compartilhe!