{
* Place a Button1 and DriveComboBox1 on your form.
* The function "SetCurrentDir" well be true if the disk in drive
* The procedure "GetDiskFreeSpaceEx" returns the free and total disk size
}uses
SysUtils;
implementationfunction GetDiskSize(drive: Char; var free_size, total_size: Int64): Boolean;
var
RootPath: array[0..4] of Char;
RootPtr: PChar;
current_dir: string;
begin
RootPath[0] := Drive;
RootPath[1] := ':';
RootPath[2] := '\';
RootPath[3] := #0;
RootPtr := RootPath;
current_dir := GetCurrentDir;
if SetCurrentDir(drive + ':\') thenbegin
GetDiskFreeSpaceEx(RootPtr, Free_size, Total_size, nil);
// this to turn back to original dir
SetCurrentDir(current_dir);
Result := True;
endelsebegin
Result := False;
Free_size := -1;
Total_size := -1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
free_size, total_size: Int64;
beginif GetDiskSize(DriveComboBox1.Drive, free_size, total_size) then
ShowMessage('free space =' +
IntToStr(free_size) + #13 + 'total size=' +
IntToStr(total_size))
else
ShowMessage('No disk in drive!');
end;
Программа на Delphi, которая получает общий и свободный объем диска, указанный пользователем через комбобокс. Программа использует функцию GetDiskFreeSpaceEx для получения информации о размере диска.
В улучшенной версии кода добавлены дополнительные комментарии и обработка ошибок:
unitDiskSize;interfaceusesSysUtils,Windows;constMAX_PATH=260;typeTForm1=class(TForm)Button1:TButton;DriveComboBox1:TComboBox;procedureButton1Click(Sender:TObject);privatefunctionGetDiskSize(drive:Char;varfree_size,total_size:Int64):Boolean;public{ Public declarations }end;varForm1:TForm1;implementationfunctionGetDiskSize(drive:Char;varfree_size,total_size:Int64):Boolean;varRootPath:array[0..MAX_PATH]ofChar;RootPtr:PChar;current_dir:string;begin// Build the root pathStrPCopy(RootPath,drive+':');RootPtr:=PChar(RootPath);// Set the current directory to the specified drivecurrent_dir:=GetCurrentDir;ifnotSetCurrentDir(drive+'\')thenbeginResult:=False;free_size:=-1;total_size:=-1;Exit;end;try// Get the disk space information using GetDiskFreeSpaceExGetDiskFreeSpaceEx(RootPtr,free_size,total_size,nil);exceptonE:ExceptiondobeginResult:=False;free_size:=-1;total_size:=-1;end;end;// Set back the current directory to its original valueSetCurrentDir(current_dir);Result:=True;end;procedureTForm1.Button1Click(Sender:TObject);varfree_size,total_size:Int64;beginifGetDiskSize(DriveComboBox1.Drive,free_size,total_size)thenShowMessage('Free space = '+IntToStr(free_size)+#13+'Total size = '+IntToStr(total_size))elseShowMessage('No disk in drive!');end;end.
В улучшенной версии:
Добавлен константа MAX_PATH для предотвращения жесткого кодирования максимальной длины пути.
Используется функция StrPCopy для копирования буквы диска и двоеточия в массив RootPath, что более эффективно, чем ручное соединение строк.
Добавлена обработка ошибок для функции SetCurrentDir для обеспечения правильного установки текущего каталога перед попыткой получения информации о размере диска.
Используется блок try-except для ловли исключений, thrown by the GetDiskFreeSpaceEx function и установка результата в False, если произошла ошибка.
Добавлены комментарии для объяснения, что каждый раздел кода делает, что делает программу более понятной для других (или для себя).
В статье предлагается способ получения объема диска и его свободного места в Delphi, используя функцию GetDiskFreeSpaceEx и процедуру SetCurrentDir для изменения текущей директории.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.