Отримання відомостей про диски

При записі файлу на диск (особливо якщо це змінний носій - дискета чи флешка) бажано спочатку перевірити, а чи вистачить вільного місця? Для цього призначені функції DiskFree (n) і DiskSize (n). Перша повертає обсяг вільного місця на диску в кілобайтах, друга - загальний розмір диска в кілобайтах. Функції повертають "дуже довге" 64-бітове ціле число типу INT64. Параметр n - ціле число, яким кодується диск: 0 - поточний диск, 1 - дисковод А. 3 - диск С: і т.д. Наприклад, можна вивести інформацію про диск:

ffFixed, 10,2) + 'Гб, вільно' +

FloatTostrF (DiskFree (d) / 1073741824, ffFixed, 10,2) + 'Гб'

На вхід функції FreeSpace подається ім'я диска як текстовий рядок, скажімо, 'D: \'. Для перетворення текстового імені диска в його порядковий номер використовується наступний прийом: обчислюється код букви диска ORD (d [1]) і з нього віднімається код букви А. Якщо ім'я диска A: \, то після вирахування отримаємо 0, С: \ - отримаємо двійку і т.д. А якщо до цієї різниці додати одиницю, то диску A: \ відповідатиме 1, диску B: \ - 2 ... що і потрібно. Константа 1073741824 = 1024 3 служить для перекладу кілобайт в гігабайти.

А як дізнатися, які взагалі логічні диски в системі? Простіше простого:

IF DirectoryExists (c + ': \') THEN

Виконуємо цикл по всіх можливих імен дисків від C: до Z. Дисководи не чіпаємо, щоб не лякати користувача. Якщо шлях до чергового диску знайдений, записуємо ім'я диска в динамічний масив текстових рядків. Наприклад, за допомогою такої функції можна вивести список дисків в компонент TComboBox:

procedure TForm1.Button1Click (Sender: TObject);

А як визначити, з чим ми маємо справу - з дисководом, вінчестером, мережевим диском? Для цього призначена функція GetDriveType, вбудована в API-функції Windows. Розглянемо приклад:

CASE GetDriveType (PCHAR (s)) OF

1: Result: = 'Немає диска';

DRIVE_REMOVABLE: Result: = 'Дисковод або Flash';

DRIVE_FIXED: Result: = 'Жорсткий диск';

DRIVE_REMOTE: Result: = 'Cетевой диск';

DRIVE_RAMDISK: Result: = 'Віртуальний диск'

Result: = 'Не можу визначити'

Так як всі функції API Windows працюють з покажчиками на текстові рядки, звичайну паскалевская рядок типу STRING доводиться перетворювати в покажчик за допомогою операції PCHAR.