Getting the amount of free disk space
   


Mark Horridge pointed out that my earlier GetDiskFree() function did not work on some Windows 95B/98 machines because of a buggy Windows.pas GetDiskFreeSpaceEx() function (See http://www.dataweb.nl/~r.p.sterkenburg/generated/entry0414.htm for a detailed explanation). I created this function to get the correct free disk space in bytes. You must declare the following 3 functions to override the one in Windows.pas to get the correct results.

{$DEFINE Delphi3Below}
{$IFDEF VER130} //Delphi 5
  {$UNDEF Delphi3Below}
{$ELSE}
  {$IFDEF VER120} //Delphi 4
    {$UNDEF Delphi3Below}
  {$ENDIF}
{$ENDIF}


{$IFDEF Delphi3Below}

  function GetDiskFreeSpaceExA(lpDirectoryName: PAnsiChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: comp;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
  function GetDiskFreeSpaceExW(lpDirectoryName: PWideChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: comp;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
  function GetDiskFreeSpaceEx(lpDirectoryName: PChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: comp;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
{$ELSE}

  function GetDiskFreeSpaceExA(lpDirectoryName: PAnsiChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: TLargeInteger;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
  function GetDiskFreeSpaceExW(lpDirectoryName: PWideChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: TLargeInteger;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
  function GetDiskFreeSpaceEx(lpDirectoryName: PChar;
    var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes: TLargeInteger;
    lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
{$ENDIF}


implementation

function GetDiskFreeSpaceExA; external kernel32 name
  'GetDiskFreeSpaceExA'; 
function GetDiskFreeSpaceExW; external kernel32 name
  'GetDiskFreeSpaceExW'; 
function GetDiskFreeSpaceEx; external kernel32 name
  'GetDiskFreeSpaceExA';
function GetDiskFree(Drive: char): comp;

{ func to return the free space of a drive in bytes. }

var
{$IFDEF Delphi3Below}

  lpFreeBytesAvailableToCaller,
  lpTotalNumberOfBytes, 
  lpTotalNumberOfFreeBytes : comp;
{$ELSE}

  lpFreeBytesAvailableToCaller,
  lpTotalNumberOfBytes, 
  lpTotalNumberOfFreeBytes : TLargeInteger;
{$ENDIF}

begin
  if GetDiskFreeSpaceEx(PChar(Drive + ':\'), lpFreeBytesAvailableToCaller, 
                        lpTotalNumberOfBytes, @lpTotalNumberOfFreeBytes) then
    Result := lpTotalNumberOfFreeBytes
  else
    Result := -1;
end;


Blue Orb Software

[email protected]