Файли та каталоги

Відомо, що файлова система MS-DOS має деревоподібну структуру. В кореневому каталозі розміщуються 32-бітні елементи, які вміщують інформацію про файли та інші директорії. Для читання кореневої директорії необхідно визначити його розташування та розмір.

Коренева директорія знаходиться зразу за останньою копією FAT. Кількість секторів, що займає одна копія FAT, знаходиться в BOOT-секторі в полі із зміщенням 11. кількість копій FAT в тому ж полі (в блоці ВРВ – блок параметрів BIOS). Таким чином, перед кореневим каталогом знаходиться один BOOT-сектор та декілька секторів таблиці розміщення файлів FAT.

Розмір кореневого каталогу можна визначити, виходячи із значення поля rootsize (блок ВРВ). У цьому полі при формуванні диску записується максимальна кількість файлів та каталогів, які можуть знаходитись в кореневому каталозі. Для кожного елемента в каталозі відводиться 32 байта, тому кореневий катал має довжину (32*rootsize) байт.

Кореневий каталог займає неперервну область фіксованого розміру. Розмір кореневого каталогу задається при форматуванні та визначає максимальну кількість файлів та каталогів, що може бути описана в кореневому каталозі. Для визначення кількості секторів, що займає кореневий каталог, можна скористатись такою формулою:

 

RootSecs = 32 × rootsize / sectsize,

 

де rootsize – максимальне число дескрипторів файлів, що може міститися в кореневому каталозі диску; sectsize – розмір сектору в байтах, він може бути отриманий з відповідного поля BOOT-сектору.

Після кореневого каталогу на логічному диску знаходиться область файлів та підкаталогів кореневого каталогу.

Область даних розбита на кластери, причому нумерація кластерів починається з числа 2. Кластеру з номером 2 відповідають перші сектори області даних. Приведемо формулу, яка дозволить зв’язати номер кластеру з номерами секторів які він займає на логічному диску:

 

SectNu = DataStart + (ClustNu - 2) clustsize,

DataStart = ressecs + fatsize × fatcnt + 32 × rootsize / sectsize,

 

де SectNu – номер першого сектора, розподіленого кластеру з номером ClustNu; ClustNu – номер кластера, для якого необхідно визначити номер першого сектора; Clustsize – кількість секторів, що займається кластером, знаходиться в блоці параметрів BIOS (блок ВРВ BOOT-сектора).

 

 

Довільний каталог містить 32-байтні елементи – дескриптори, що описують файли та інші каталоги.

 

Формат дескриптора

Зміщення Розмір Вміст
(+0) Ім’я файлу або директорії, доповнене пропусками.
(+8) Розширення імені файлу, доповнене пропусками.
(+11) Атрибути файлу.
(+12) Зарезервовано.
(+22) Час створення або останньої модифікації файлу.
(+24) Дата створення або останньої модифікації файлу.
(+26) Номер першого кластеру, що виділений файлу.
(+28) Розмір файлу в байтах.

 

Байт атрибутів є у кожного файлу. Біти цього байту мають наступні значення:

0 – файл тільки для читання, в цей файл не можна писати і його не можна стирати;

1 – захований (hidden) файл, цей файл не з’являється у списку файлів;

2 – системний файл; цей біт встановлюється у файлах, що є складовою частиною ОС;

3 – цей дескриптор описує мітку диска; для цього дескриптора поля імені файла та розширення імені файла мають розглядатись як поле довжиною 11 байт; це поле вміщує містку диска;

4 – дескриптор описує файл, що є підкаталогом поданого каталогу;

5 – прапорець архівації; якщо цей біт встановлено в 1, то це означає, що даний файл не був завантажений утилітою архівації (наприклад, програмою BACK UP);

6-7 – зарезервовані.

 

Приклади.

Звичайно файли мають такі комбінації бітів в байті атрибутів:

00000000 – звичайні файли (тексти програм, модуль завантаження, пакетні файли).

00000111 – тільки файли, що читаються заховані системні файли. Така комбінація у файлах.

00001000 – мітка поля; дескриптор мітки поля може знаходитись тільки в кореневому каталозі логічного диску.

00010000 – (10h) дескриптор, що описує каталог.

00100000 – (20h) звичайний файл, який не був завантажений утилітами BACK або XCOPY.

У довільному каталозі, окрім кореневого, два перших дескриптора мають спеціальне призначення:

Перший дескриптор вміщує в полі імені рядок ”.”. Цей дескриптор вказує на каталог в який його вміщено, тобто каталог вказує має сама на себе. Другий спеціальний дескриптор вміщує в полі імені рядок ”. .”. Цей дескриптор вказує на каталог вищого рівня. Якщо в полі номера першого кластера дескриптора з іменем ”. .” знаходиться нуль, то це означає, що цей каталог розташований в кореневому каталозі.

Таким чином, в деревоподібній структурі каталогів маємо посилання як в прямому, так і в зворотному напрямках. Ці посилання можна використовувати для перевірки цілісності структури каталогів файлової системи.

При знищенні файла перший байт його імені заміняється на байт E5h (символ ’X’). Всі кластери, виділені файлу, відмічаються у FAT як вільні. Якщо файл вилучили тільки що, то його ще можна відновити, тому що в дескрипторі збереглися всі поля, крім першого байта імені файлу. Але, якщо на диск записані нові файли, то вміст кластерів вилученого файла буде змінено і відновлення стане неможливим.

Зупинимось докладніше на полях часу та дати створення або останньої модифікації файлу. DOS оновляє вміст цих полів після довільної операції, що змінює вміст файлу (створення, перезапис вмісту, додавання даних, оновлення вмісту). Після оновлення файлу DOS встановлює біт архівації байта атрибутів в 1.

 

 

Старші 5 бітів вміщують значення години модифікації файла, шість бітів з номерами 5-10 вміщують значення години модифікації файла, в молодших 5 бітах зберігається значення секунд, полене на 2. Для того, щоб час оновлення файла вмістився в 16 бітах, треба було знизити точність часу до двох секунд.

Для того, щоб отримати значення року оновлення файла, необхідно добавити до величини, що зберігається в старших семи бітах, значення 1980. поля для місяця та дня якихось особливостей не мають, вони повністю відповідають календарній даті.

 

 

Поле довжини в дескрипторі вміщує точну довжину файла в байтах. Для каталогів у полі довжини записано нульове значення. Працювати з каталогом як зі звичайним файлом засобами DOS неможливо. Єдиний спосіб прочитати каталог як файл – використати FAT для визначення ланцюжка кластерів, що займає цей каталог та прочитати сектори, що відповідають цим кластерам за допомогою переривання DOS INT 25h.

Ще раз повернемось до програми FDISK та диск-менеджерів. Як відомо, утиліта FDISK дозволяє створити розділи диску. В DOS 4.0 та вищих нема обмежень на розміри розділів та логічних дисків. Але при використанні FDISK не можна організувати захист логічних дисків від запису або від несанкціонованого доступу. Програми диск-менеджерів такі, як ADM або Speed Star, в деякій мірі розв’язують питання захисту від запису та несанкціонованого доступу. Але з’являються нові проблеми.

Диск-менеджери використовують свій власний механізм розбиття диска на розділи і тому логічна структура диску, підготовлена програмами диск-менеджерів, відрізняється від стандартної для MS-DOS. Перш за все це стосується таблиці розділів диску (Partition Table). Елементи таблиці розділів мають код системи відмінний від того, що використовується в MS-DOS. Цей код залежить від конкретної програми диск-менеджера.

Якщо диск підготовлений програмою Speed Star то всі елементи таблиці розділів будуть зайняті (MS-DOS залишає два елементи невикористаними).

Для того, щоб встановити на цей же диск іншу ОС треба вивантажити вміст всього диску на дискети, вилучити всі розділи Speed Star, створити розділи іншої ОС, а вже потім розділи MS-DOS.

Якщо диск підготовлено утилітою FDISK, то зарезервувавши заздалегідь місце для іншої ОС, можна без проблем використати два елементи таблиці розділів, що залишилися.

У таблиці розділів диску, що підготовлений програмою FDISK, знаходиться інформація про формат таблиці розміщення файлів FAT, що використовується. Можна скористуватись цією інформацією, але тільки в тому випадку, якщо диск підготовлений утилітою FDISK.