Определение размера диска и свободного пространства на нём
Магазин по пpодаже компьютеpов. Пpодавец подбиpает богатой, но не понимающей в комьютеpах даме:
- Hу вот, я вам подобpал жесткий диск получше?...
- Получше - это пожестче?
Сначала до слова implementation напишем такой код:
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar;
var lpFreeBytesAvailableToCaller : Integer;
var lpTotalNumberOfBytes: Integer;
var lpTotalNumberOfFreeBytes: Integer) : bool;
stdcall;
external kernel32
name 'GetDiskFreeSpaceExA';
И, наконец, обработаем нажатие кнопки следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
var
TotalBytes: double;
TotalFree: double;
begin
GetDiskSizeAvail('C:\', TotalBytes, TotalFree);
ShowMessage(FloatToStr(TotalBytes));
ShowMessage(FloatToStr(TotalFree));
end;
Here's a translation of the provided code into Russian:
Код, написанный на Delphi, предназначен для определения размера жёсткого диска и его доступной свободной памяти. Он использует функцию GetDiskFreeSpaceEx из Windows API для получения этой информации.
В коде есть три части:
Первая часть определяет функцию GetDiskFreeSpaceEx, которая получает информацию о указанном каталоге (lpDirectoryName). Эта функция импортируется из библиотеки kernel32 с помощью директивы external kernel32 name 'GetDiskFreeSpaceExA'.
Вторая часть определяет процедуру GetDiskSizeAvail, которая принимает три параметра: TheDrive, TotalBytes и TotalFree. Она вызывает функцию GetDiskFreeSpaceEx для получения общего количества байтов (lpTotalNumberOfBytes) и доступной свободной памяти (lpTotalNumberOfFreeBytes) для указанного диска.
Внутри процедуры GetDiskSizeAvail она проверяет, являются ли возвращенные значения корректными (больше или равны 0). Если они корректны, то она присваивает их переменным TotalBytes и TotalFree.
Если возвращенные значения не корректны, то она выполняет некоторые расчеты для определения общего размера диска (TotalBytes) и доступной свободной памяти (TotalFree). Эти расчеты включают умножение и сложение некоторых констант.
Третья часть определяет процедуру Button1Click, которая вызывается при клике кнопки на форме. Она вызывает процедуру GetDiskSizeAvail с указанием буквы диска 'C:' и присваивает возвращенные значения локальным переменным TotalBytes и TotalFree. Затем она отображает эти значения с помощью ShowMessage.
Некоторые предложения по улучшению кода:
Вместо использования жесткого кодирования буквы диска ('C:\') в процедуре Button1Click, можно позволить пользователю вводить свою желаемую букву диска.
Могло бы быть полезно обработать потенциальные ошибки, которые могут возникнуть при вызове функции GetDiskFreeSpaceEx. Например, можно проверять, возвращает ли функция значение ошибки (FALSE), и отображать соответствующее сообщение об ошибке.
Могло бы быть полезно использовать более описательные имена переменных вместо аббревиатур, таких как AvailToCall, TheSize и FreeAvail.
Могло бы быть полезно добавить комментарии или документацию для объяснения того, что делает каждый участок кода.
Обновленная версия кода, которая включает в себя эти предложения:
procedureTForm1.Button1Click(Sender:TObject);varTotalBytes,TotalFree:double;DriveLetter:string;begin// Ask user for drive letterDriveLetter:=InputBox('Enter drive letter:','Drive Letter','C:\');ifGetDiskSizeAvail(PChar(DriveLetter),TotalBytes,TotalFree)thenbeginShowMessage(FloatToStr(TotalBytes));ShowMessage(FloatToStr(TotalFree));endelseShowMessage('Error: Unable to retrieve disk size and free space.');end;functionGetDiskFreeSpaceEx(lpDirectoryName:PAnsiChar;varlpFreeBytesAvailableToCaller:Integer;varlpTotalNumberOfBytes:Integer;varlpTotalNumberOfFreeBytes:Integer):boolean;stdcall;externalkernel32name'GetDiskFreeSpaceExA';procedureGetDiskSizeAvail(TheDrive:PChar;varTotalBytes,TotalFree:double);varAvailToCall,TheSize,FreeAvail:integer;beginifnotGetDiskFreeSpaceEx(TheDrive,AvailToCall,TheSize,FreeAvail)thenRaiseLastOSError;// Handle errorifTheSize>=0thenTotalBytes:=TheSizeelsebegincaseTheSizeof-1:TotalBytes:=$7FFFFFFF*2+1;else:TotalBytes:=$7FFFFFFF+abs($7FFFFFFF-TheSize);end;end;ifAvailToCall>=0thenTotalFree:=AvailToCallelsebegincaseAvailToCallof-1:TotalFree:=$7FFFFFFF*2+1;else:TotalFree:=$7FFFFFFF+abs($7FFFFFFF-AvailToCall);end;end;end;
Обновленный код более robust и пользовательский, но он все еще имеет некоторые ограничения. Например, он предполагает, что буква диска всегда указана в формате 'C:\'. Могло бы быть полезно обработать другие форматы (например, 'D:', 'E:') также.
Определение размера диска и свободного пространства на нем код на Delphi для определения размера жесткого диска и количества доступного свободного пространства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.