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;