Запись файла
При записи на диск нового файла выполняется следующая процедура (приводится с упрощениями):
По результатам анализа FAT определяется первый свободный ее элемент, номер которого записывается в очередную запись соответствующего каталога в качестве номера начального кластера.
По данным таблицы формата диска, расположенной в его boot-секторе, и известному размеру файла в байтах вычисляется количество кластеров, необходимых для размещения файла.
Начиная с начального элемента FAT, определяется цепочка свободных элементов (содержащих "0"), расположенных в порядке возрастания их номеров. При этом в каждый элемент записывается номер следующего элемента цепочки, а в последний элемент записывается код (F)FF9h (EOF).
Файл последовательно записывается в кластеры рабочей области диска, номера которых соответствуют номерам элементов FAT, включенных в цепочку.
Например (см. рис.3), при записи файла размером 1234 байта на дискету стандартного формата (512 байтов в секторе, 1 сектор в кластере), этому файлу будет выделено три кластера с номерами 10, 11 и 16. При этом последний (16-й) кластер будет занят лишь частично. Удаление файла
При удалении файла стандартными средствами (командой DEL):
Рабочая область диска не модифицируется, то есть файл физически сохраняется в кластерах, выделенных ему при записи.
Сохраняется также и регистрационная запись об этом файле в соответствующем каталоге, в том числе длина файла и ссылка на номер его начального кластера.
Первый символ имени удаляемого файла в его регистрационной записи заменяется на код E5h (этот код соответствует строчной русской букве "х", недопустимой с точки зрения соглашения об именах MS DOS) - наличие такого символа в начале имени файла является признаком того, что файл логически удален.
Обнуляется вся цепочка элементов FAT удаляемого файла, что делает соответствующие кластеры доступными для последующей записи.
Анализ рассмотренных выше процедур записи и удаления файлов показывает, что в ряде случаев сохраняется возможность восстановления удаленного файла (до тех пор, пока на его место физически не записан другой файл). Для восстановления логически удаленного файла достаточно изменить в регистрационной записи соответствующего каталога первый символ имени файла на любой из допустимых и восстановить в FAT цепочку номеров кластеров, занятых этим файлом. Копирование, переименование и перемещение файла
При переименовании файла изменяются только значения полей "Имя" и "Расширение" соответствующей регистрационной записи каталога. Процедура копирования файла реализуется последовательным выполнением рассмотренных выше процедур чтения, записи и переименования. Процедура перемещения файла между двумя каталогами одного логического диска сводится к перемещению соответствующей регистрационной записи. Если же файл перемещается на другой логический диск, то он "удаляется" с одного диска и "копируется" на другой.
Некоторые особенности fat-12
Программа DiskEdit нами уже упоминалась. Также упоминалось, что пользоваться ею нужно очень осторожно. По умолчанию обычно установлен режим "Только чтение". Если вы не вполне уверены, что правильно понимаете и представляете себе структуру диска, лучше этот режим не отключайте. Далее мы разберем пример использования этой программы для чтения дискеты (1,4 МБ), потому как начинать эксперименты лучше с дискетой. Дискета имеет файловую систему FAT-12. Для начала несколько самых основных понятий для тех, кто впервые сталкивается с двоичной системой счисления: Бит - это один разряд в двоичном числе. Например, двоичное число 1001 содержит 4 бита (четырехразрядное двоичное число). Байт - это восемь битов (байт: 10100010 - двоичное число или А2 - шестнадцатиричное число или 162 - десятичное) Слово - это два байта (1010001010100010b = A2A2h = 41636) Смещение - это смещение от относительного адреса. Например, запустив программу DiskEdit, вы увидели следующее:
00000000: 11 12 34 А8 00 12 67 00 - 00 00 00 00 00 00 00 ВВ
00000010: 10 02 3В А0 05 33 77 00 - 00 00 00 00 00 00 00 00
Относительный адрес в первой строке равен 0 (00000000). Следующая за ним шестнадцатиричная цифра 11 находится по смещению +00 (0+00=0), цифра 12 - по смещению +01 (0+01=1) и т.д. Последняя цифра в этой строке (BB) находится по смещению +0F (0+0F = Fh = 15). Во второй строке по смещению +06 находится число 77. ОБРАТИТЕ ВНИМАНИЕ: число 77 находится по смещению +06 относительно второй строки, и по смещению +16h относительно первой строки. С этими нюансами вам придется постоянно сталкиваться - привыкайте. Самое интересное здесь для нас - это представление слова данных в памяти компьютера и чтение этих данных. Например, при просмотре диска программой DiskEdit, мы увидели такое слово данных (два смежных байта): 12 А3 Если просто перевести его в десятичный формат, то получим: 12А3 = 4771 это правильный перевод. Однако нам так делать нельзя. Из-за некоторых особенностей компьютера перед тем как перевести шестнадцатиричное число в десятичное, нам нужно поменять байты местами. Тогда получим: А312 = 41746 А это уже правильное число. Причин этих премудростей я объяснять не буду - уж поверьте на слово, что так оно все и есть. Но еще смешнее будет разбираться (с учетом вышесказанного) с файловой системой FAT-12. Потому как здесь мы будем иметь дело с 12-битными блоками данных. Т.е. каждый такой блок больше одного байта, но меньше слова. При такой системе очень легко запутаться и разобраться где там какой кластер/сектор и т.д. Предлагаю следующий метод (я его сам придумал, поэтому, быть может, он не является самым простым). Не забываете, что в каждом слове данных нам нужно менять местами байты. Допустим, что мы имеем следующий участок FAT:
слово |
0 |
1 |
2 |
3 |
||||
смещение |
+00 |
+01 |
+02 |
+03 |
+04 |
+05 |
+06 |
+07 |
значение |
F0 |
FF |
FF |
03 |
40 |
00 |
FF |
0F |
Рисунок 4. Меняем местами байты нулевого слова (F0FF -> FFF0) и записываем результат в самой правой части страницы:
FF F0
Меняем местами байты первого слова (FF03 -> 03FF) и записываем результат слева от сделанной нами записи:
03 FF FF F0
Меняем местами байты второго слова (4000 -> 0040) и записываем результат слева от сделанной нами записи:
00 40 03 FF FF F0
Меняем местами байты третьего слова (FF0F -> 0FFF) и записываем результат слева от сделанной нами записи:
0F FF 00 40 03 FF FF F0
Теперь разделяем полученную нами цепочку на трехразрядные числа, начиная с правой части:
Элемент FAT -> |
4 |
3 |
2 |
1 |
0 |
Значение -> |
FFF |
004 |
003 |
FFF |
FF0 |
Читаем справа налево. Номер элемента FAT соответствует номеру кластера. На дискете первые два элемента FAT (первые три байта) занимает служебная информация. Ссылки на кластеры, которые содержат файлы и каталоги, начинаются со второго элемента FAT (с 3-го байта - и не забудьте, что отсчет ведется с нуля). В нашем примере файл занимает 3 кластера. Второй элемент FAT содержит число 3. Это значит, что продолжение цепочки нужно искать в 3-м элементе. 3-й элемент содержит число 4, т.е. цепочка продолжается. В 4-м элементе содержится признак конца файла - число FFF. Так как число FFF означает конец файла, то ноль, который "затесался" к нам из последнего слова, нас уже не интересует. Если мы запишем на дискету еще один файл, то вместо нуля может появиться какое-нибудь другое число. Параметры стандартной дискеты
Дискета стандартного формата (1,4 МБ) имеет следующие параметры: Таблица 5. Параметры стандартной дискеты.
Параметр |
Значение |
Размер сектора |
512 Б |
Секторов в кластере |
1 |
Количество секторов перед первой FAT |
1 |
Количество FAT |
2 |
Максимальное число элементов корневого каталога |
224 |
Общее число секторов |
2880 |
Количество секторов в одной FAT |
9 |
Количество секторов на дорожке |
18 |
Количество поверхностей |
2 |
Количество спрятанных секторов |
0 |
Емкость |
1457664 Б |
Самый простой способ определения максимально возможного количества файлов, размещенных на дискете стандартного формата - это разделить емкость дискеты на размер кластера: 1457664/512 = 2847 Но мы не ищем простых путей! Поэтому, используя вышеприведенные параметры, которые можно просмотреть с помощь программы DiskEdit (не забывайте "переворачивать" байты, если данные имеют размер слова), попробуем получить тот же результат. Итак,
У нас есть один загрузочный сектор, а параметр "Количество секторов перед первой FAT" равен 1. Это значит, что перед FAT только этот один загрузочный сектор и расположен.
Параметр "Количество секторов в одной FAT" равен 9 и параметр "Количество FAT" равен 2. То есть две копии FAT занимают на дискете 18 секторов (9*2 = 18).
Параметр "Максимальное число элементов корневого каталога" равен 224. Каждый элемент корневого каталога занимает 32 Б. Умножаем 224 на 32: 224*32 = 7168. Делим это число на 512 (размер сектора) и получаем число 14. То есть корневой каталог занимает 14 секторов.
Подсчитываем количество секторов, занимаемых служебной информацией: 1(загрузочный) + 18(FAT) + 14(корень) = 33.
Осталось отнять от общего количества секторов (2880) полученное нами число: 2880 - 33 = 2847. То есть 2847 - это количество секторов, доступных для хранения пользовательских файлов.
Получили тот же результат. Т.к. любой файл занимает на диске не менее одного кластера, а на дискете стандартного формата в кластере содержится один сектор, то получается, что максимально возможное количество файлов на такой дискете равно 2847. Логично? Да! Но не правильно. Я и сам на этом в контрольной "прокололся". Здесь есть несколько нюансов. Как говорит наш преподаватель по информатике: "Дискета - это не просто мешок с файлами". Дело в том, что мало просто заполнить файлами эти 2847 секторов. Надо ведь к этим файлам еще как-то обращаться. А для этого в корневом каталоге имеется набор регистрационных записей (см. Корневой каталог (Root Directory)). А максимальное число элементов корневого каталога, как сказано выше, равно 224. Вот и получается, что на дискету (в корень) можно записать не более 224 файлов. Ну а если есть необходимость записать большее количество файлов, то в "корень" записывают, например, 223 файла. А вместо 224-го записывают подчиненный каталог, который будет иметь уже свою структуру регистрационных записей. В него можно будет записать новые файлы (см. Подчиненные каталоги). Читаем файл с дискеты
Ну а теперь попробуем пройти всю процедуру чтения файла (см."Алгоритмы выполнения типовых файловых операций"). Только чуть-чуть ее упростим - пусть на нашей дискете будет только один файл с именем NAME.TXT. В корневом каталоге дискеты (физический диск А) нам нужно найти соответствующую запись. Однако где ж его этот корневой каталог искать? А корневой каталог следует сразу за областью FAT. На стандартной дискете FAT занимает 18 секторов (две копии FAT по 9 секторов каждая) и еще 1 сектор занимает загрузочная область (см. табл.5). Следовательно, корневой каталог начинается с 20-го сектора. Но как нам найти этот 20-й сектор? Дискета читается следующим образом: сначала читается 0-я дорожка, 0-я сторона, 1-й сектор (нумерация секторов начинается с единицы). Затем 0-я дорожка, 0-я сторона, 2-й сектор и т.д. до 18-го сектора. Затем читается 0-я дорожка, 1-я сторона, 1-й сектор, 2-й сектор и т.д. до 18-го. Затем читается 1-я дорожка, 0-я сторона, 1-й сектор, 2-й сектор и т.д. до 18-го и т.д. и т.п. Т.е. 20-й сектор у нас будет на 0-й дорожке, 1-й стороне во втором секторе. Чтобы сразу перейти к этому сектору в меню "Object" программы DiskEdit выберите пункт "Phisical Sector" и укажите в поле "Cylinder" значение "0", в поле "Side" значение 1, а в поле "Sector" значение 2 и нажмите Enter. Вот вы и перешли в корневой сектор дискеты. Можете "декодировать" находящуюся там информацию, используя таблицу 2. Не забывайте "переворачивать" байты, если данные занимают слово. Теперь находим в корневом каталоге наш файл (NAME.TXT) и смотрим номер начального кластера. Чтобы посмотреть сам файл, нужно посмотреть цепочку FAT, которая начинается с этого кластера, т.е. перейти непосредственно к этому кластеру, а затем посмотреть остальные кластеры в цепочке. Обычно (хотя и не всегда) они следуют друг за другом. Кластеры начинаются сразу за корневым каталогом. Корневой каталог стандартной дискеты (1,4 МБ) занимает 14 секторов. 14+19=33. Т.е. с 34 сектора у нас начинается область пользовательских данных (подробности см. в "Вычисление номеров дорожки/поверхности/сектора"). Если нужный нам файл находится не в корневом каталоге, то сначала находим номер начального кластера каталога, в котором находится файл. Затем переходим в этот кластер и ищем там имя нужного файла. Смотрим номер начального кластера для этого файла и т.д. Соглашение об именах
Файлы и подчиненные каталоги в MS-DOS должны иметь имена, содержащие не более 8 символов (английских букв, цифр и некоторых других символов), и могут иметь расширение (а могут и не иметь), содержащее не более 3-х символов. В ПОЛНОМ имени файла разрешается использовать только следующие символы: A-Z 0-9 $ & # ~ ( ) - % ! _ ^ В ПОЛНОМ имени файла запрещается использовать все остальные символы! ЗАПРЕЩАЕТСЯ В ПОЛНОМ имени файла использовать ПРОБЕЛ! Примеры допустимых имен файлов: Format.com, Read.me, MyFyle.txt, 28-03-96.doc, 123.45 Примеры НЕ допустимых имен файлов: 123456789.txt, aa?.doc, 35*.? It.F.doc, .txt
