Что происходит при создании каталога
Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Что происходит при создании каталога





При создании каталога для него «пожизненно» выставляется DIR_FileSize = 0. Размер содержимого каталога определяется простым следованием по цепочкам кластеров до метки End Of Chain. Размер самого каталога лимитируется файловой системой в 65 535 32-байтных записей (т.е. записи каталога в таблице FAT не могут занимать более 2Мб). Это ограничение призвано ускорить операции с файлами и позволить различным служебным программам использовать 16 битное целое (WORD) для подсчета количества записей в директории. (Как следствие, возникает теоретическое ограничение на количество файлов в каталоге – 65 535 при условии, что все имена файлов следуют стандарту 8.3). Каталогу отводится один кластер области данных (за исключением случая, если это корневой каталог FAT12/FAT16) и полям DIR_FstClusHI / DIR_FstClusLO присваивается значение номера этого кластера. В таблицу FAT для записи, соответствующей этому кластеру, помещается метка EOC, а сам кластер забивается нулями. Далее создаются два специальных файла, без которых директория FAT считается поврежденной (первые две 32-байтных записи в области данных кластера) – файлы нулевого размера “dot” (идентификатор каталога) и “dotdot” (указатель на родительский каталог) с именами “.” (точка) и “..” (две точки) соотв. Штампы даты-времени этих файлов приравниваются значениям для самого каталога на момент создания и не обновляются при изменениях каталога. Поля DIR_FstClusHI / DIR_FstClusLO файла «.» содержат значение номера содержащего его кластера, а файла «..» – номера первого кластера каталога, содержащего данный. Таким образом, файл «.» отсылает к самому каталогу, а файл «..» – к начальному кластеру родительского каталога; если родительский каталог – корневой, начальным кластером считается нулевой.



 

Время и дата

Двухбайтовый штамп даты имеет следующий формат: биты 0-4 – день месяца, допускаются значения 1-31; биты 5-8 – месяц года, допускаются значения 1-12; биты 9-15 – год, считая от 1980 г. («эпоха MS-DOS»), возможны значения от 0 до 127 включительно, т.е. 1980-2107 гг.

Два байта, отвечающие штампу времени, распределяются так: биты 0-4 – счетчик секунд (по две), допустимы значения 0-29, т.е. 0-58 секунд; биты 5-10 – минуты, допустимы значения 0-59; биты 11-15 – часы, допустимы значения 0-23.

Из штампов даты-времени критическим является лишь штамп времени последней модификации (т.е. DIR_WrtTime и DIR_WrtDate), остальные могут не поддерживаться многими системами; при операциях с файлом в такой системе (например, DOS или Windows 3.1) такие поля игнорируются. FAT сохраняет штампы даты-времени по местному часовому поясу, при его смене штампы не изменяются.

Временные штампы каталогов задаются при создании и не изменяются при записи новых файлов в каталог, переименовании или выделении ему нового кластера.

Дата последнего доступа к файлу обновляется при каждом обращении, например при просмотре свойств файла, при перемещении на другой том (но не в пределах тома). При копировании файла в Windows 98 дата последнего доступа исходного файла обновляется, в Windows XP – нет.

Дата-время модификации файла изменяется при каждой записи нового содержимого в области данных (не в файловой записи). Другими словами, дата-время модификации не изменяется при смене атрибутов или переименовании файла. Перемещение или копирование файла сохраняет исходный штамп модификации.

Дата-время создания задается при выделении файловой записи для нового, не существовавшего до этого файла. Иначе говоря, при переименовании или перемещении файла дата-время создания не изменяется, а при копировании новый файл получает новый штамп. Таким образом, при копировании файла в Windows файл может получить более позднюю дату создания, чем дату модификации.

 

LFN-записи

Файлы и каталоги с длинным именем (свыше 8.3) обрабатываются файловой системой FAT особым образом. Структура 32-битной записи для файла с LFN (Long File Name) отличается от обычной (SFN-записи):

LDIR_Ord. Первый байт записи, служит для нумерации записей в наборе.

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

LDIR_Attr. Байт атрибута по адресу 0х0A, равен 0х0F (ATTR_LONG_NAME).

LDIR_Type. Байт по адресу 0х0B, обнулен и дополнительно свидетельствует, что данная запись таблицы FAT относится к файлу с длинным именем.

LDIR_Chksum. Байт по адресу 0х0C, содержит контрольную сумму SFN псевдонима файла, соответствующего набору LFN-записей.

LDIR_Name2. 12-байтовое поле по адресу 0х0D, содержащее шестой-одиннадцатый символы имени файла.

LDIR_FstClusLO. 2-байтовое поле по адресу 0х1A, в контексте LFN-записи лишено смысла и обнуляется.

LDIR_Name3. 4-байтовое поле по адресу 0х1C, содержащее 12-й и 13-й символы имени файла.

Набор LFN-записей каталога FAT всегда должен быть связан с обычной SFN-записью, которой физически предшествует на диске. Набор LFN-записей, обнаруженный без соответствующей обычной записи, называется орфаном и запись считается поврежденной; подобный файл является совершенно невидимым в старых версиях MS-DOS/Windows. В последовательности LFN-записей каждая из них имеет собственный порядковый номер, определяемый первым байтом (LDIR_Ord). Маска 0х40 свидетельствует, что данная запись является крайней в ряду следующих за ней LFN-записей (т.е., например, для третьей в ряду LFN-записи значение байта LDIR_Ord будет 0x43, для 17-й – 0x51). В последующих записях этот байт изменяется от N для N-й «длинной» записи по счету от соответствующей обычной, до 1 для ближайшей к обычной записи. Длинные имена файлов хранятся в кодировке UNICODE (UTF-16), при этом сохраняется вводимый регистр буквенных символов. Если некоторый символ имени в кодировке OEM или UNICODE не может быть превращен в символ кодовой страницы, он всегда отображается в виде символа подчеркивания «_», при чем сохраненный на диске действительный символ не изменяется. Байт контрольной суммы вычисляется по определенному алгоритму на основе 8.3 имени обычной записи (для файла с длинным именем «имя» из обычной записи называется псевдонимом – alias) и копируется во все соответствующие ей «длинные» записи. Если какое-либо из значений не согласуется с именем файла (например, если файл был переименован под ранней версией MS-DOS/Windows), возникает орфан. 8.3-Псевдоним файла с длинным именем состоит из основной части и, при необходимости, цифрового «хвоста». Если файл имеет расширение, его первые 3 символа сохраняются в псевдониме. Соответствующее имя образуется переводом в кодировку OEM символов длинного имени файла, причем все пробелы длинного имени игнорируются, а символы, непереводимые в OEM либо запрещенные в контексте короткого имени, заменяются подчеркиванием «_». Цифровой хвост «~n», где n = 1 ÷ 999999, добавляется к псевдониму, если первоначально полученный псевдоним конфликтовал с именем какого-либо файла в той же директории, либо превышал стандарт 8.3, или если какой-либо символ при смене кодировки не нашел OEM-аналога и был заменен подчеркиванием. Таким образом образуются псевдонимы типа NEWFIL~1.DJV (LFN = New file for me.djvu). Схема образования псевдонима файла оптимизирована для скорости операций и поэтому малопредсказуема в подробностях. Имя файла длиной, некратной 13 символам, не заполняет поля имени LFN-записей таблицы FAT полностью. В таком случае имя файла искусственно оканчивается символом NUL (0x00), а избыточные байты забиваются единицами (т.е. символами 0xFF).

Для длинных имен длина имени ограничена 255 символами, не считая разделителя NUL, а полный путь – 260 символами, включая NUL. В длинном имени также допускается использование шести специальных символов, запрещенных в коротких именах: + , ; = [ ] При попытке создания в томе FAT32 файла или каталога с именем, содержащим такой символ, автоматически генерируется LFN-запись независимо от длины имени файла. Аналогичный процесс происходит при создании файла/папки с именем, содержащим не-ASCII символы. Возможна ситуация, когда файл метки тома физически не предшествует всем записям тома с длинными именами (когда том не имеет метки или метка была назначена после записи какого-либо файла с длинным именем). Тогда метка тома в FAT12/FAT16 будет отображаться неправильно, так как будет взята из ближайшей LFN-записи (поскольку она также имеет атрибут VOLUME_ID), и при попытке изменения метки тома в действительности будет происходить нарушение имени соответствующего файла. При удалении файла, имеющего ассоциированные LFN-записи, последние не затрагиваются и становятся орфаном. При дальнейшем создании нового файла упомянутый орфан может быть ошибочно ассоциирован с ним в случае совпадения контрольных сумм имен старого и нового файлов, однако используемый алгоритм вычисления контрольной суммы (ASCII-код первого символа псевдонима файла циклически сдвигается на бит вправо и прибавляется код следующего символа и т.д.) делает такую вероятность ничтожно малой.

 









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.