Getting the total disk size
   


The DiskSize() function in Delphi does not work for larger drives ( > 2GB ). Mark Horridge pointed out that my earlier GetDiskSize() function did not work on some Windows 95B/98 machines because of a buggy Windows.pas GetDiskFreeSpaceEx() API (See http://www.dataweb.nl/~r.p.sterkenburg/generated/entry0414.htm for a detailed explanation). I created this function to get the correct total disk space in bytes. You must declare the following 3 functions to override the one in Windows.pas to get the correct results. To get the total bytes of a directory, see DirSize().

{$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 GetDiskSize(Drive: char): comp;
{ func to return the total size 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 := lpTotalNumberOfBytes
  else
    Result := -1;
end;


Blue Orb Software
[email protected]