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 вы можете увидеть пример программы, обсуждаемой в данном разделе.
Читайте также: