...find the size of a file?

Author: JD McDonnell
Homepage: http://www.greaterthanzen.com

Category: Files

function Get_File_Size1(sFileToExamine: string; bInKBytes: Boolean): string;
{
 for some reason both methods of finding file size return
 a filesize that is slightly larger than what Windows File
 Explorer reports
}
var
  
FileHandle: THandle;
  FileSize: LongWord;
  d1: Double;
  i1: Int64;
begin
  
//a- Get file size
  
FileHandle := CreateFile(PChar(sFileToExamine),
    GENERIC_READ,
    0, {exclusive}
    
nil{security}
    
OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);
  FileSize   := GetFileSize(FileHandle, nil);
  Result     := IntToStr(FileSize);
  CloseHandle(FileHandle);
  //a- optionally report back in Kbytes
  
if bInKbytes = True then
  begin
    if 
Length(Result) > 3 then
    begin
      
Insert('.', Result, Length(Result) - 2);
      d1     := StrToFloat(Result);
      Result := IntToStr(round(d1)) + 'KB';
    end
    else
      
Result := '1KB';
  end;
end;

{******************************************************************************
Thanks to Advanced Delphi Systems here's another method which works just as
well returning the same results
*******************************************************************************}
function Get_File_Size2(sFileToExamine: string; bInKBytes: Boolean): string;
var
  
SearchRec: TSearchRec;
  sgPath: string;
  inRetval, I1: Integer;
begin
  
sgPath := ExpandFileName(sFileToExamine);
  try
    
inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec);
    if inRetval = 0 then
      
I1 := SearchRec.Size
    else
      
I1 := -1;
  finally
    
SysUtils.FindClose(SearchRec);
  end;
  Result := IntToStr(I1);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  if 
OpenDialog1.Execute then
    
label1.Caption := Get_File_Size(Opendialog1.FileName, True);
end;

{*******************************************************************************}

function Get_File_Size3(const FileName: string): TULargeInteger;
// by nico
var
  
Find: THandle;
  Data: TWin32FindData;
begin
  
Result.QuadPart := -1;
  Find := FindFirstFile(PChar(FileName), Data);
  if (Find <> INVALID_HANDLE_VALUE) then
  begin
    
Result.LowPart  := Data.nFileSizeLow;
    Result.HighPart := Data.nFileSizeHigh;
    Windows.FindClose(Find);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if 
(OpenDialog1.Execute) then
    
ShowMessage(IntToStr(Get_File_Size3(OpenDialog1.FileName).QuadPart));
end;

{*******************************************************************************}

function Get_File_Size4(const S: string): Int64;
var
  
FD: TWin32FindData;
  FH: THandle;
begin
  
FH := FindFirstFile(PChar(S), FD);
  if FH = INVALID_HANDLE_VALUE then Result := 0
  else
    try
      
Result := FD.nFileSizeHigh;
      Result := Result shl 32;
      Result := Result + FD.nFileSizeLow;
    finally
      
CloseHandle(FH);
    end;
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base