Delphi проверка наличия диска

Обновлено: 06.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Информация о состоянии диска достаточно актуальна для любых приложений. Допустим, что ваша программа должна скопировать какой-то файл. Если на диске не будет достаточного объема свободного пространства, то произойдет лишняя ошибка, которая может ввести пользователя в заблуждение. Любая ошибка будет только лишним минусом для программы, поэтому от таких досадных ошибок, как нехватка ресурсов, лучше предостерегаться заранее.

Нехватка дискового пространства - одна из самых неприятных проблем, поэтому перед созданием/копированием больших файлов лучше проверять доступность необходимого пространства. Это особенно касается программ установки.

Окно, отображающее информацию о выбранном диске

Рис. 6.4. Окно, отображающее информацию о выбранном диске

Помимо доступного пространства можно узнать серийный номер тома, на котором установлена программа. С помощью такого номера очень удобно и надежно делается защита от копирования программы без инсталляции. После установки программа может запомнить где-нибудь серийный номер тома и затем проверять его при старте. Если серийный номер изменился, то программа должна требовать переустановки, где вы можете реализовать более жесткие возможности защиты программы.

В моей программе на вкладке Диски вы можете узнать основные сведения о любом диске (рис. 6.4). Для этого на вкладке у меня расположен компонент DriveComboBox с закладки Win 3.1 для выбора диска и куча компонентов TLabel, в которых отображается вся полученная информация.

Получение информации происходит по событию OnChange компонента DriveComboBoxi. Здесь вызывается процедура updateDisk. Ее нужно описать в разделе private следующим образом:

А сама процедура должна выглядеть, как в листинге 6.2.

В самом начале все ОСНОВНЫе перемениые lpVolumeNameBuffer, lpVolumeSerial-Number, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer обнуляются. После этого с помощью процедуры GetMem выделяется память для переменных lpVolumeNameBuffer И lpFileSystemNameBuffer. В переменные nVolumeNameSize И nFileSystemNameSize заносится разивр выделенной памяти для предьтдущих переменных.

Для получения информации о выбранном диске используется WinAPI-npo-цедура GetVolumelnf ormation, у которой следующие параметры:

• fs_vol_is_compressed - файловая система поддерживает компрессию на уровне тома (например, DoubleSpace тома диска).

размер буфера для имени файловой системы.

После вывода на экран полученной информации вызывается еще одна функция - GetDiskFreeSpace, с помощью которой можно рассчитать свободное дисковое пространство. Но пока мы не рассчитываем этого, потому что данный вопрос будем обсуждать немного позже. С помощью этой функции мы узнаем количество секторов в кластере и количество байтов в секторе. Давайте рассмотрим параметры функции GetDiskFreeSpace:

переменная, в которую будет записано количество свободных кластеров; О переменная, в которую будет записано общее количество кластеров. По размеру кластера и количеству свободных кластеров можно рассчитать общий размер свободного пространства. По размеру кластера и общему количеству кластеров можно узнать общий размер диска.

Вот теперь рассмотрим пример универсальной функции, которая рассчитывает размер диска:

В первой строке узнаем размер и количество свободных кластеров. Во второй строке производим расчет с помощью перемножения количества свободных кластеров, количества секторов в кластере и количества байтов в секторе. Результат расчета делим на 1024, чтобы перевести результат из байтов в килобайты.

На компакт-диске в директории \Примеры\Глава 6\System Info вы можете увидеть пример программы, обсуждаемой в данном разделе.

Читайте также: