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
functionGetDiskFreeSpaceExA; external kernel32 name 'GetDiskFreeSpaceExA'; function GetDiskFreeSpaceExW; external kernel32 name 'GetDiskFreeSpaceExW'; function GetDiskFreeSpaceEx; external kernel32 name 'GetDiskFreeSpaceExA';
functionGetDiskSize(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;