Вот, не парься:
Код:
function GetFreeDriveSpace(sDriveLetter, sSizeType: String): Int64;
const
CharString: String[26] = 'abcdefghijklmnopqrstuvwxyz';
var
FreeBytesAvailableToCaller: Int64;
FreeSize: Int64;
TotalSize: Int64;
btCounter: Byte;
bContain: Boolean;
begin
Result := 0;
sDriveLetter := LowerCase(sDriveLetter);
SetLength(sDriveLetter,2);
sDriveLetter[2] := ':';
bContain := False;
for btCounter := 0 to 26 do
begin
if AnsiStartsText(CharString[btCounter],sDriveLetter) = True then
begin
bContain := True;
Break;
end;
end;
if bContain = False then
begin
Result := 0;
Exit;
end;
GetDiskFreeSpaceEx(PChar(sDriveLetter),FreeBytesAvailableToCaller,Totalsize,@FreeSize);
if LowerCase(sSizeType) = 'b' then
begin
Result := FreeBytesAvailableToCaller;
end
else if LowerCase(sSizeType) = 'kb' then
begin
Result := FreeBytesAvailableToCaller div 1024;
end
else if LowerCase(sSizeType) = 'mb' then
begin
Result := FreeBytesAvailableToCaller div 1048576;
end
else if LowerCase(sSizeType) = 'gb' then
begin
Result := FreeBytesAvailableToCaller div 1073741824;
end
else if LowerCase(sSizeType) = 'tb' then
begin
Result := FreeBytesAvailableToCaller div 1073741824; // написал в 2 строки, т.к. не помню, выйдет ли
Result := Result div 1024; // за рамки допустимого число 1099511627776, так сказать, чтобы не рисковать =)
end;
end;
Набросал на скорую руку (не проверял в делфе), можно сделать оптимизированнее.
PS: в качестве параметра sDriveLetter передавай только букву диска, без двоеточия и слэша, т.е. не C:\ или C:, а просто C.
в качестве параметра sSizeType передавай b,kb,mb,gb,tb - ну соответственно, результатом ф-ии будет размер в байтах, килобайтах, мегабайтах, гигабайтах или террабайтах.