Главная » Ассемблер, Железо » Каталоги файлов

0

Каталог файлов представляет собой массив 32-байтных элементов — описателей файлов. С точки зрения операционной системы все

каталоги (кроме корневого каталога в системах FAT12 и FAT16) выглядят как файлы и могут содержать произвольное количество записей.

Корневой каталог (Root Directory) — это главный каталог диска, с которого начинается дерево подкаталогов. Для корневого каталога в FAT12 и FAT16 выделено в системной области логического диска специальное место фиксированного размера (16 Кбайт), рассчитанное на хранение 512 элементов. В системе FAT32 корневой каталог является файлом произвольного размера.

Структура элемента каталога файлов приведена в табл. 6.36. Элемент начинается с 11-байтного поля DIR Name, содержащего так называемое короткое имя (Short name) файла, по которому операционная система обычно осуществляет поиск файла в каталоге. Короткое имя состоит из двух полей: 8-байтного поля, содержащего собственно имя файла, и 3-байтного поля, содержащего расширение. Если введенное пользователем имя файла короче восьми символов, то оно дополняется пробелами (код пробела — 20h); если введенное расширение короче трех байтов, то оно также дополняется пробелами. Разделительная точка между именем и расширением файла не хранится в структуре данных; она подставляется программами операционной системы после имени файла только при выполнении операций, требующих взаимодействия с пользователем (задание имени файла, вывод списка файлов на экран и т. д.). Кроме того, следует учитывать, что в коротком имени все текстовые символы преобразуются операционной системой в верхний регистр.

Таблица 6.36. Структура элемента каталога

Наименование

Смещение

Размер,

Описание

элемента

 

байт

 

DIR_Name

OOh

11

Короткое имя файла

DIRAttr

OBh

1

Атрибуты файла

DIR_NTRes’

OCh

1

Поле зарезервировано для Windows NT (должно содержать значение 0)

DIR_CrtTimeTenth’

ODh

1

Поле, уточняющее время создания файла (содержит десятки миллисекунд). Значение поля может находиться в пределах от 0 до 199

DIRCrtTime1

OEh

2

Время создания файла

DIRCrtDate’

10h

2

Дата создания файла

Таблица 6.36 (продолжение)

Наименование

Смещение

Размер,

Описание

элемента

 

байт

 

DIR_LstAccDate1

12h

2

Дата последнего обращения к файлу для записи или считывания данных

DIRFstClasHl’

14h

2

Старшее слово номера первого кластера файла

DIRWrtTime

16h

2

Время выполнения последней операции записи в файл

DIR_WrtDate

18h

2

Дата выполнения последней операции записи в файл

DIR_FstClusLO

1Ah

2

Младшее слово номера первого кластера файла

DIRFileSize

1Ch

4

Размер файла в байтах (32-разрядное число)

Индекс 1 означает, что поле обрабатывается только в файловой системе FAT32. В системах FAT12 и FAT16 поле считается зарезервированным и содержит значение 0.

Первый байт короткого имени (DIR_Name[0]) выполняет функции признака занятости элемента каталога:

•      если DIR_Name[0] = E5h, то элемент каталога свободен (то есть его можно использовать при создании нового файла);

•      если DIR_Name[0] = OOh, то элемент каталога свободен и является началом чистой области каталога (после него нет ни одного использованного элемента);

•      если DIR_Name[0] = 05h, то следует считать, что в этом байте находится ASCII-символ с кодом 0E5h (символ KANJI японской азбуки).

На использование ASCII-символов в коротком имени накладывается ряд ограничений:

•      нельзя использовать символы с кодами меньше 20h (за исключением кода 05h в DIR_Name[0]);

•      нельзя использовать символы с кодами 22h, 2Ah, 2Bh, 2Ch, 2Eh, 2Fh, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh, 5Bh, 5Ch, 5Dh, 7Ch;

•      нельзя использовать символ пробела (код 20h) в DIR_Name[0].

При задании пользователем имени файла допускается отсутствие расширения, но имя должно содержать по крайней мере один символ.

Рис. 6.3. Формат байта атрибутов файла

Формат байта атрибутов файла DIR_Attr показан на рис. 6.3. Разряды байта атрибутов устанавливаются в 1 в том случае, если у файла имеется соответствующее свойство:

•     бит 0 — файл только для чтения;

•     бит 1 — скрытый файл;

•     бит 2 — системный файл;

•     бит 3 — идентификатор тома;

•     бит 4 — каталог;

•     бит 5 — архивированный файл;

•     биты 6 и 7 — зарезервированы, должны быть установлены в 0.

Признаком того, что свободный элемент каталога используется для хранения участка длинного имени файла, является наличие единиц в разрядах 0-3 байта атрибутов (для описателей файлов и каталогов такое сочетание невозможно).

Рис. 6.4. Формат поля времени

Поле времени создания файла DIR_CrtTime и поле времени выполнения последней операции записи в файл DIR_WrtTime имеют формат, показанный на рис. 6.4. Назначение разрядов полей времени следующее:

•     биты 0-4 — двухсекундный отсчет (допустимо значение от 0 до 29);

•     биты 5-10 — минута (допустимо значение от 0 до 59);

•     биты 11-15 — час (допустимо значение от 0 до 23).

При создании файлов отсчет дат ведется от начала эпохи MS-DOS, то есть от 01.01.1980. Поля даты создания файла DIR_CrtDate, даты последнего обращения к файлу DIR_LstAccDate и даты выполнения последней операции записи в файл DIR_WrtDate имеют формат, показанный на рис. 6.5. Назначение разрядов указанных полей:

•     биты 0-4 — день месяца (допустимо значение от 1 до 31);

•     биты 5-8 — номер месяца в году (допустимо значение от 1 до 12);

•     биты 9-15 — номер года минус 1980 (допустимо значение от 0 до 127).

Рис. 6.5. Формат поля даты

Номер первого кластера файла (и точка входа в таблицу FAT) задаются полями DIR_FstClusLO и DIR_FstC1usHI, содержащими младшее слово и старшее слово номера кластера соответственно. Для FAT12 и FAT16 определено только поле DIR_FstCl usLO, a DIR_FstCl usHI является зарезервированным и должно содержать нулевое значение. Поле размера файла DIR_Fi 1 eSi ze является 32-разрядным числом, что позволяет задавать размер файла до 4 Гбайт (4 294 967 295 байт). Хотя каталоги по сути также являются файлами, значение этого поля для них устанавливается в ноль. Ограничение на размер каталога с этим полем никак не связано и вызвано тем, .что дисковые утилиты операционной системы используют в качестве счетчика элементов каталога 16-разрядное слово (каталог может содержать до 65 536 32-байтных элементов и занимает, таким образом, не более 2 097 152 байт).

Новые версии операционной системы Windows (начиная с Windows 95) позволяют присваивать файлу (в дополнение к короткому имени) так называемое длинное имя (Long name), используя для его хранения пустые элементы каталога, смежные с основным элементом — описателем файла. Короткое и длинное имена файла являются уникальными, то есть не должны встречаться дважды в одном каталоге.

Информация, которую можно найти о структуре длинного имени в Интернете [74], явно устарела, но некоторые сведения я все-таки получил. Длинное имя записывается не ASCII-символами, а в формате Unicode, где каждому национальному алфавиту соответствует собственный набор кодов. Расплатой за универсальность Unicode является снижение плотности хранения информации — каждый символ занимает два байта (16-разрядное слово). В пустые элементы каталога длинное имя записывается в разрезанном на кусочки виде, как показано в табл. 6.37.

В одном элементе каталога можно сохранить фрагмент длиной до 13 символов Unicode (поскольку в трех участках имеется в сумме 26 байт). Неиспользованный участок последнего фрагмента заполняется кодами FFFFh.

Таблица 6.37. Структура элемента каталога, хранящего фрагмент длинного имени файла

Наименование элемента

Смещение

Размер, байт

Описание

DIR_Counter

OOh

1

Номер фрагмента

DIRLnamel

01h

10

Первый участок фрагмента имени

DIR_Attr

OBh

1

Атрибуты файла

DIR_Flags

OCh

1

Байт флагов

DIR_ChkSum

ODh

1

Контрольная сумма короткого имени

DIR_LName2

OEh

12

Второй участок фрагмента имени

DIR_First

1Ah

2

Номер первого кластера (должен быть равен 0)

DIR_LName2

1Ch

4

Третий участок фрагмента имени

Длинное имя записывается в каталог первым, причем фрагменты размещены в обратном порядке, начиная с последнего — как показано на рис. 6.6. Вслед за длинным (полным) именем размещается стандартный описатель файла, содержащий укороченный по специальному алгоритму вариант этого имени. Фрагменты длинного имени пронумерованы. В младших разрядах байта номера фрагмента хранится собственно номер, разряд 6, вероятно, служит признаком последнего фрагмента длинного имени (имеет значение 1 для последнего фрагмента, у остальных фрагментов — 0), а разряд 7 зарезервирован (равен 0).

Все каталоги, за исключением корневого, содержат в двух первых элементах вместо описателей файлов специальные ссылки. В элементе с номером 0 размещается указатель на сам каталог, а в поле имени находится одна точка («.»). В элементе с номером 1 размещается

указатель на родительский каталог (каталог более высокого уровня), а в поле имени находятся две точки («..»). Если ссылка на таблицу FAT у элемента № 1 имеет нулевое значение, то текущий каталог находится в корневом каталоге.

Рис. 6.6. Порядок записи в каталог описателя файла с длинным именем

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии