48889 (588618), страница 2
Текст из файла (страница 2)
Послідовність кластерів, яка може належати одному об’єкту в таблиці ФАТ, представляє собою односпрямований список, голова якого в явному виді відсутня, а кінець визначається ознакою кінця ланцюжка.
-
Структура елемента каталогу
Кожен каталог представляє собою послідовність дескрипторів. Структура дескриптора об’єкта з коротким ім’ям наведена у табл. 2.6 для FAT13/FAT16 та у табл. 2.8 для FAT32. Структура байту атрибуту у табл. 2.7.
Таблиця 2.6 – Структура дескриптора для FAT12 / FAT16
Зсув | Розмір, байт | Опис | Ім’я |
0 | 1 | Ознака дескриптору: 0 – вільний; E5h - видалений; інше-перший символ імені об’єкту | fn |
1 | 7 | 7 символів імені об’єкту | name |
8 | 3 | Розширення об’єкту | ext |
11 | 1 | Байт атрибутів | attr |
12 | 10 | Резерв | reserv |
22 | 2 | Час створення або останньої модифікації | TimeMade |
24 | 2 | Дата створення або останньої модифікації | DateMade |
26 | 2 | Молодша частина початкового кластеру об’єкта | FirstCluster |
28 | 4 | Розмір об’єкта в байтах | SizeFileInBytes |
Таблиця 2.7 – Байт атрибутів об’єкта
Номербіту | Значення біту | Опис |
0 | 1 | Об’єкт тільки для читання |
1 | 1 | Об’єкт схованого типу |
2 | 1 | Об’єкт системного типу |
3 | 1 | Мітка тому |
4 | 1 | Директорія |
5 | 1 | Архівний файл |
6 | Не використовується |
Таблиця 2.8 – Структура дескриптора для FAT32
Зсув | Розмір, байт | Опис | Ім’я |
0 | 1 | Ознака дескриптору: 0 – вільний; E5h - видалений; інше-перший символ імені об’єкту | fn |
1 | 7 | 7 символів імені об’єкту | name |
8 | 3 | Розширення об’єкту | ext |
11 | 1 | Байт атрибутів | attr |
12 | 1 | Резерв | reserv |
13 | 2 | Час створення (0.1 секунд) | TimeMadeSec |
14 | 2 | Час створення | TimeMade |
16 | 2 | Дата створення або останньої модифікації | DateMade |
18 | 2 | Дата останнього звертання | DateLast |
20 | 2 | Старший байт номеру першого кластеру, який був виділений об’єкту | FirstClusterHigh |
22 | 2 | Час останньої модифікації об’єкту | TimeLast |
24 | 2 | Дата останнього запису об’єкту | DateLastWrite |
26 | 2 | Молодший байт номеру першого кластеру, який був виділений об’єкту | FirstClusterLow |
28 | 4 | Розмір файлу в байтах | SizeFileInBytes |
Якщо об’єкт іменується довгим ім’ям, то під нього виділяється декілька дескрипторів стандартного розміру (32б). Кількість дескрипторів визначається довжиною імені об’єкта. Максимальна довжина імені об’єкта – 255 символів, які зберігаються в форматі UNICODE (по два байти на один символ). У кожному дескриптору може зберігатися 13 символів імені об’єкту. Структура дескриптора для довгого імені наведена у табл. 2.9.
Таблиця 2.9 – Структура дескриптора для довгого імені
Зсув | Розмір, байт | Опис | Ім’я |
0 | 1 | Номер порції імені | fn |
1 | 10 | 5 символів імені об’єкту | FiveSymb |
11 | 1 | Байт атрибутів, дорівнює 0Fh | attr |
12 | 1 | Завжди дорівнює 0 | reserv |
13 | 1 | Контрольна сума короткого ім’я | CRC |
14 | 12 | 6 символів імені об’єкту | SixSymb |
26 | 2 | Резерв | reserv2 |
28 | 4 | 2 символа імені об’єкту | TwoSymb |
Ім’я в останній порції довгого імені може бути меншим за 13 символів. У такому випадку значима частина імені завершується нулем. усі інші поля імені заповнюються FFFF.
-
Програмні структури
Всі необхідні програмні структури представлені в header- файлах. Ціль їхнього створення - організація даних, прочитаних з носіїв. Наприклад, кожний жорсткий диск буде представлений структурою
typedef struct _HARDINFO
{
char nHard; //номер жорсткого диску
void* hDrive; //хендл жорсткого диску
UINT dwSectorSize; //розмір сектора
UINT bitsPerSector; //кількість розрядів для адресації всередині сектора
UINT dwExtendedAddr; //адреса розширеного розділу
PLOGICAL_DISC disklist;
} HARDINFO, *PHARDINFO;
Інформація про розділи організується в список структур, по одному списку на кожний жорсткий диск:
typedef struct _LOGICAL_DISC
{
void* next;
char nHard;
char nDisc;
char active;
UINT abs_addr;
UINT secLength;
UINT id;
char* cpFS;
UINT SN4;
UINT gbLength;
UINT mbLength;
void* disc_info;
UINT prcfree;
} LOGICAL_DISC, *PLOGICAL_DISC, **PPLOGICAL_DISC;
Після того, як FAT32-розділ був відкритий для читання, інформація про нього записується в таку структуру
typedef struct _DISC_INFO {
char Disc; //логічний диск
UINT beginFAT; //адреса початку FAT-таблиці у секторах
UINT nBytePerSector; //розмір сектора у байтах
void* hDrive; //хендл відкритого розділу
char SectPerCluster; //розмір кластера в секторах
UINT BytesPerCluster; //розмір кластера в байтах
UINT sizeFAT; //розмір FAT-таблиці в секторах
UINT* pFAT; //адреса образу FAT-таблиці у ОЗУ
UINT sizeFATbytes; //розмір FAT-таблиці в байтах
USHORT nFATCopy; //кількість копій FAT
USHORT sizeReserved; //розмір зарезервованої області в секторах
UINT bitsPerSector; //кількість розрядів для адресації всередині сектора
UINT RootCluster; //номер першого кластера корневой директории
UINT dwRootDirSize; //кількість кластерів для кореневої директорії
HDIR hRootDir; //хендл кореневої директориії
UINT prcfree;
BOOL bFAT16;
UINT RootSector;
UINT nRootElements;
} DISC_INFO, *PDISC_INFO;
Список прочитаних файлів організується в структуру:
typedef struct _FILES {
char* ansiname;
UINT attrib;
UINT firstcluster;
__int64 filesize;
void* next;
} FILES, *PFILES;
Якщо необхідно вивести на екран уміст файлу, спочатку його вміст буде відображено в таку структуру:
typedef struct _FILEBUF {
char* pBuf;
char* ansiname;
UINT dwLen;
} FILEBUF, *PFILEBUF;
3 ОПИС АЛГОРИТМІВ ПЗ ФМ
У цьому пункті розглядаються послідовно алгоритми пошуку та іменування дисків, доступу до об’єктів файлової системи, визначення зайнятого місця для файлової системи FAT32, FAT16.
3.1 Алгоритм пошуку дисків й іменування дисків
Алгоритм іменування логічних дисків засновано на звіренні серійного номера, отриманого логічного диска із серійним номером, збереженим системою.
Рисунок 3.1 – Пошук та найменування дисків
3.2 Алгоритм доступу к об’єктам файлової системи
Основна концепція файлової системи FAT полягає в тім, що кожному файлу й каталогу виділяється структура даних, називана дескриптором. У цій структурі зберігається ім'я файлу, його розмір, початкова адреса вмісту файлу й інші метадані. Данні файлів і каталогів зберігається в блоках даних, називаних кластерами. Якщо файлу або каталогу виділяється більш одного кластера, інші кластери знаходять за допомогою структури даних, називаної FAT(File Allocation Table). Структура FAT використовується як для ідентифікації наступних кластерів у файлах, так і для визначення стану кластерів. Існує три версії FAT: FAT12, FAT16 і FAT32. Вони відрізняються друг від друга насамперед розміром запису у структурі FAT. Зв'язки між структурами даних показано на рис. 3.4.
Рисунок 3.4 – Зв’язки між структурами даних
Файлова система FAT ділиться на три фізичні області для FAT32, та на чотири для FAT12/16. Перша область називається зарезервованою; в FAT12 і FAT16 зарезервована область займає всього 1 сектор, але формально її розмір визначається в завантажувальному секторі. Друга область FAT - містить основні й резервні структури FAT. Вона починається в секторі, котрий розташовано за зарезервованою областю, а її розмір визначається кількістю й розміром структур FAT. Третя – кореневий каталог, для FAT12/16 починається за областю FAT, а у FAT32 має повільне положення у області даних. Область даних - містить кластери, виділені для зберігання файлів і вмісту каталогів.
Доступ до файлових об’єктів виконується з припущення, що відома адреса першого кластеру об’єкту.
У даній реалізації алгоритм доступу до об’єктів містить дві частини – алгоритм пошуку шляху до поточної директорії та алгоритм пошуку об’єктів у завантаженій директорії.
Алгоритм пошуку об’єктів в каталогі наведено на рис. 3.2
Алгоритм пошуку поточного шляху - рис.3.3
Рисунок 3.2 – Алгоритм пошуку об’єктів в каталогі
Рисунок 3.3 – Алгоритм пошуку поточного шляху