Копирование, переименование и перемещение файла
При переименовании файла изменяются только значения полей "Имя" и "Расширение" соответствующей регистрационной записи каталога.
Процедура копирования файла реализуется последовательным выполнением рассмотренных выше процедур чтения, записи и переименования.
Процедура перемещения файла между двумя каталогами одного логического диска сводится к перемещению соответствующей регистрационной записи. Если же файл перемещается на другой логический диск, то он "удаляется" с одного диска и "копируется" на другой.
Некоторые особенности 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:
слово | ||||||||
смещение | +00 | +01 | +02 | +03 | +04 | +05 | +06 | +07 |
значение | F0 | FF | FF | FF | 0F |
Рисунок 4.
Меняем местами байты нулевого слова (F0FF -> FFF0) и записываем результат в самой правой части страницы:
FF F0
Меняем местами байты первого слова (FF03 -> 03FF) и записываем результат слева от сделанной нами записи:
FF FF F0
Меняем местами байты второго слова (4000 -> 0040) и записываем результат слева от сделанной нами записи:
FF FF F0
Меняем местами байты третьего слова (FF0F -> 0FFF) и записываем результат слева от сделанной нами записи:
F FF 00 40 03 FF FF F0
Теперь разделяем полученную нами цепочку на трехразрядные числа, начиная с правой части:
Элемент FAT -> | |||||
Значение -> | FFF | FFF | FF0 |
Читаем справа налево. Номер элемента FAT соответствует номеру кластера. На дискете первые два элемента FAT (первые три байта) занимает служебная информация. Ссылки на кластеры, которые содержат файлы и каталоги, начинаются со второго элемента FAT (с 3-го байта - и не забудьте, что отсчет ведется с нуля). В нашем примере файл занимает 3 кластера. Второй элемент FAT содержит число 3. Это значит, что продолжение цепочки нужно искать в 3-м элементе. 3-й элемент содержит число 4, т.е. цепочка продолжается. В 4-м элементе содержится признак конца файла - число FFF. Так как число FFF означает конец файла, то ноль, который "затесался" к нам из последнего слова, нас уже не интересует. Если мы запишем на дискету еще один файл, то вместо нуля может появиться какое-нибудь другое число.
Параметры стандартной дискеты
Дискета стандартного формата (1,4 МБ) имеет следующие параметры:
Таблица 5. Параметры стандартной дискеты.
Параметр | Значение |
Размер сектора | 512 Б |
Секторов в кластере | |
Количество секторов перед первой FAT | |
Количество FAT | |
Максимальное число элементов корневого каталога | |
Общее число секторов | |
Количество секторов в одной FAT | |
Количество секторов на дорожке | |
Количество поверхностей | |
Количество спрятанных секторов | |
Емкость | 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