Управление дисками и каталогами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Управление дисками и каталогами



Поверхность диска разделена на ряд концентрических колец (дорожек), которые, в свою очередь, делятся радиально на сектора. Дисковые сектора определяются магнитной информацией, которую записывает утилита форматирования диска. Для всех типов дисков в MS DOS размер сектора равен 512 байт. Файл располагается на таком количестве секторов, которое необходимо для его полного размещения. Диск использует таблицу размещения файлов (File Allocation Table – FAT) для отведения дискового пространства файлам и хранения информации о свободных секторах. FAT хранит информацию о каждом кластере секторов на диске. Кластер – это группа стандартных секторов размером 512 байт. Каждая позиция в FAT соответствует определённой позиции кластера на диске. Обычно файл занимает несколько кластеров, и запись в каталоге файлов содержит номер стартового кластера, в котором находится начало файла. Просмотрев позицию FAT, соответствующую первому кластеру,  MS DOS находит номер кластера, в котором хранится следующая порция файла и т.д. по цепочке.

Каждый диск имеет один корневой каталог, с которого начинается поиск всех каталогов. Корневой каталог может содержать элементы, указывающие на подкаталоги, которые, в свою очередь, могут содержать ссылки на другие подкаталоги. Корневой каталог всегда расположен в определённых секторах диска. Подкаталоги хранятся как обычные дисковые файлы и могут располагаться в любом месте диска. Каталоги имеют различные размеры в зависимости от размера диска и его разбиения на разделы. Как корневой каталог, так и подкаталоги используют 32 байта для хранения информации об одном файле. Описание структуры 32-байтового поля (дескриптора) файла представлено в табл. 2.1.

Точка между именем файла и его расширением не хранится. Все поля выровнены по левой границе, а пустые байты заполняются пробелами. Атрибут файла определяет, является ли он скрытым, защищённым от записи и т.п. Он также определяет специальные элементы каталога: подкаталоги, метка тома. Информация о времени и дате упакована, поэтому для чтения этих значений требуются битовые операции.

Таблица 2.1

Описание структуры дескриптора файла

Номера байтов Назначение байтов
0 – 7 Имя файла
8 – 10 Расширение файла
11 Атрибут файла
12 – 21 Зарезервировано
26 – 27 Начальный кластер
38 – 31 Размер файла

Начальный кластер указывает на позицию в таблице FAT. Поскольку файл обычно не целиком занимает последний отведённый ему кластер, то в поле «Размер файла» хранится точная длина файла в байтах.

Рассмотрим несколько функций для работы с дисками и каталогами.

Установка/ проверка дискового накопителя по умолчанию. Программы могут экономить часть работы, назначая дисковый накопитель, на котором хранятся каталоги и файлы данных, по умолчанию.

1. Для установки дискового накопителя по умолчанию необходимо в регистр AH записать функцию 0 Eh, в регистр DL поместить номер диска (00 h – A, 01 h – B и т.д.), вызвать прерывание 21 h. Эта функция возвращает в регистре AL максимально возможный в данной системе номер диска.

2. Функция 19 h прерывания 21 h сообщает о том, какой дисковый накопитель установлен по умолчанию, возвращая номер диска в регистре AL (00 h – A, 01 h – B и т.д.). Входных регистров для данной функции нет.

Определение доступного дискового пространства. Программа должна контролировать доступное дисковое пространство и сообщать пользователю о нехватке места. В этом случае пользователь может выйти из программы и устранить ошибку без потери информации.

Для получения информации о свободном дисковом пространстве необходимо в регистр AH записать функцию 36 h, в регистр DL поместить номер диска (00 h – текущий накопитель, 01 h – А и т.д.), вызвать прерывание 21 h. При возврате регистр AX содержит либо код ошибки FFFFh, если в регистре DL был указан неправильный номер устройства, либо количество секторов в одном кластере, если ошибки не возникло; BX содержит число свободных кластеров; CX – размер сектора в байтах, DX – общее число кластеров на диске. Используя эту информацию, можно посчитать свободное пространство на диске () и полный объём диска ().

Создание/ удаление подкаталога. Программа может создавать и удалять подкаталоги только при соблюдении определённых условий. Для создания подкаталога необходимо, чтобы было хотя бы одно пустое место в корневом каталоге. Для удаления подкаталога необходимо, чтобы он не содержал ссылок на другие подкаталоги и файлы (был пустым). Кроме того, нельзя удалить текущий каталог, в котором по умолчанию выполняются все операции над подкаталогами. Также нельзя удалить корневой каталог.

1. Для создания подкаталога необходимо, чтобы пара регистров DS: DX указывала на строку, содержащую имя накопителя и путь к каталогу, в котором нужно создать подкаталог. Строка должна заканчиваться байтом ASCII 0. Последнее имя пути – имя создаваемого подкаталога. Все перечисленные имена каталогов до создаваемого нового должны существовать. Далее в регистр AH требуется поместить функцию 39 h и вызвать прерывание 21 h. Если указан правильный путь, то будет создан новый каталог. В противном случае будет установлен флаг переноса CF, а в регистре AX будет содержаться код ошибки: 3 – несуществующий путь; 5 – доступ запрещён.

2. Для удаления подкаталога необходимо, чтобы пара регистров DS: DX указывала на строку, содержащую путь к удаляемому подкаталогу. Затем в регистр AH требуется поместить функцию 3 Ah и вызвать прерывание 21 h. Если указан правильный путь, то будет удалён заданный подкаталог. В противном случае будет установлен флаг переноса CF, а в регистре AX будет содержаться код ошибки: 3 – несуществующий путь; 5 – доступ запрещён; 10 h – попытка удаления текущего каталога.

 

Получение/ изменение текущего каталога. Текущий каталог – это каталог, в котором MS DOS ищет файл, если путь к нему не указан. Если не установлено противного, то текущим является корневой каталог.

1. Чтобы определить текущий каталог, надо в регистр AH поместить функцию 47 h, в регистр DL – номер накопителя (00 h – текущий накопитель, 01 h – А и т.д.); пара регистров DS: SI должна указывать на 64-байтовый буфер для записи полного пути от корневого каталога. Если был указан несуществующий накопитель, то будет установлен флаг переноса CF, а в регистре AX будет содержаться код ошибки: 0 Fh. Если ошибок не возникло, то данная функция возвращает строку, которая начинается с имени первого подкаталога пути (имя диска и символ «\» не указываются). Байт ASCII 0 сигнализирует о конце строки.

2. MS DOS позволяет установить текущий каталог. Для этого пара регистров DS: DX должна указывать на путь к подкаталогу (как описано выше, при создании и удалении подкаталогов); затем в регистр AH поместить функцию 3 Bh и вызвать прерывание 21 h. Если указан правильный путь, то указанный подкаталог будет установлен как текущий. В противном случае будет установлен флаг переноса CF, а в регистре AX будет содержаться код ошибки: 3 – несуществующий путь.

Подготовка файлов к операциям чтения/ записи

В программах, написанных на языках высокого уровня, вся подготовительная работа при операциях с файлами выполняется автоматически. При использовании языка ассемблера требуется создание специальных областей данных, которые используются при операциях ввода – вывода. Для доступа к файлам используется метод дескриптора файла. При доступе к файлам MS DOS автоматически создаёт область данных для файла, а затем – уникальный 16-битовый код номера файла. Впоследствии этот «номер» используется функциями DOS для идентификации того открытого файла, с которым производится операция. Прежде чем использовать файл в программе, его необходимо открыть. Если файл не существует, то перед открытием его нужно создать. При удалении файла соответствующий элемент каталога на самом деле не удаляется, он становится недействующим за счёт замены первого байта элемента (первого символа имени файла). Впоследствии этот элемент может быть перезаписан при создании нового файла. Также вносятся изменения в FAT, чтобы сектора, занятые удаленным файлом, были доступны для других файлов. Само содержимое при этом не стирается.

Создание/ удаление файла. 1. Можно создать файл, не помещая в него никакой информации. В этом случае создаётся элемент каталога, а длина файла устанавливается равной 0.

Функция 3 Ch (пересылается в регистр AH) прерывания 21 h создаёт и открывает новый файл. Регистры DS: DX должны указывать на строку, представляющую путь к файлу и имя файла в коротком формате и заканчивающуюся ASCII -кодом 0. Если файл создаётся не накопителе, принятом по умолчанию, то в строку включается имя диска. В регистр CX помещается байт атрибутов файла, которые представлены в табл. 2.2. Для создания обычного файла в регистр CX следует поместить 0.

Таблица 2.2

Описание структуры регистра атрибутов

Номера битов Назначение битов
0 =1 – файл только для чтения
1 =1 – скрытый файл
2 =1 – системный файл
3 =1 – создаваемый элемент является не файлом, а меткой тома; =0 – для создания файла
4 =1 – создаваемый элемент является подкаталогом; =0 – для файла
5 =1 – файл был изменён с даты последней архивации; =0 – файл не был изменён
6 – 15 =0 – резервные биты

Бит 5 – это архивный бит, используемый программами BACKUP и RESTORE MS DOS. Этот бит сбрасывается в 0 после архивации и устанавливается в 1, если с файлом снова работали.

При успешном выполнении флаг переноса CF будет равен 0, а в регистре AX будет возвращён дескриптор файла. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 3 – не найден путь, 4 – нет свободного дескриптора файла, 5 – отказ в доступе.

Если в каталоге уже существует файл с таким именем, он обрезается до нулевой длины и тем самым разрушается. Для более «мягкого» создания и открытия (без ущерба прежнему содержимому) файла можно использовать функцию 5 Bh прерывания 21 h. Её действие аналогично предыдущей функции; однако если файл с таким именем существует, она вернёт в регистре AX код ошибки 50 h. В этом случае можно перейти к открытию файла.

Также в MS DOS (с версии 3.0) имеется функция 5 Ah прерывания 21 h для создания временного «безымянного» файла. В этом случае сама ОС генерирует имя для файла и проверяет, что такого файла ещё нет в каталоге. Регистры DS: DX должны указывать на ASCII -строку с путём, заканчивающимся символом «\» и 13 дополнительными нулевыми байтами. Завершается строка ASCII -кодом 0. В регистр CX помещается байт атрибутов файла, которые представлены в табл. 2.2. После успешного выполнения флаг переноса CF будет равен 0, а в регистре AX будет возвращён дескриптор файла. Произвольное имя файла добавляется к концу строки пути. При возникновении ошибок флаг переноса устанавливается в 1, а в регистре AX возвращается код ошибки: 3 – не найден путь, 4 – нет свободного дескриптора файла, 5 – отказ в доступе. Файл, созданный этой функцией, не уничтожается автоматически; программа должна удалить его, используя соответствующую функцию.

2. Для удаления файла используется функция 41 h (пересылается в регистр AH) прерывания 21 h. Регистры DS: DX должны указывать на ASCII -строку с путём к удаляемому файлу, заканчивающуюся 0. Если при выполнении функции ошибок не возникло, то указанный файл будет удалён. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 2 – не найден файл, 3 – не найден путь, 5 – отказ в доступе.

Следует отметить, что данная функция не позволяет удалять файлы с атрибутом «только для чтения». В этом случае предварительно необходимо изменить атрибуты удаляемого файла.

Открытие/ закрытие файла. 1. При открытии файла создаются небольшие блоки памяти, в которые помещается информация о файле. Они будут служить буфером, через который данные будут передаваться между памятью и файлом. Языки высокого уровня создают такой буфер автоматически, язык ассемблера – нет.

При открытии файла проверяется его наличие в каталоге. Если файл найден, ОС MS DOS берёт информацию из каталога о размере и дате создания файла. По умолчанию в MS DOS может быть одновременно открыто не более 8 файлов.

Для открытия файла используется функция 3 Dh прерывания 21 h. Регистры DS: DX должны указывать на ASCII -строку, содержащую путь к файлу и его имя, включая имя накопителя, если это необходимо. Вся строка должна быть не длиннее 63 байт и завершаться символом ASCII 0. В регистр AL помещается код доступа: 0 – открытие файла для чтения, 1 – открытие файла для записи, 2 – открытие файла для чтения/ записи. Если файл открыт успешно, флаг переноса CF будет равен 0, а в регистр AX будет возвращён 16-битовый номер файла, по которому файл идентифицируется. Файловый указатель устанавливается на начало файла. Если при открытии файла произошла ошибка, то флаг переноса устанавливается в 1, а в регистре AX возвращается код ошибки: 2 – не найден файл, 4 – открыто слишком много файлов, 6 – ошибка диска, 12 – ошибка кода доступа.

Данная функция позволяет также открывать скрытые файлы.

2. При закрытии файла ОС обновляет информацию в каталоге. Если перед завершением программы не закрыть файл, это может привести к потере данных. Эта функция является необязательной, поскольку функция 4 Ch, которая завершает программу, в числе прочих действий выполняет и закрытие всех файлов.

Для закрытия файла используется функция 3 Eh прерывания 21 h. В регистр BX помещается номер (дескриптор) файла, полученный при его открытии. Если файл закрыт успешно, то флаг переноса CF будет равен 0. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 6 – указан неверный номер (дескриптор) файла.

Получение/ изменение атрибутов файла. 1. Для получения значений атрибутов файла в регистр AH помещается функция 43 h, в регистры DS: DX – указатель на строку с путём к файлу и именем файла, завершающуюся символом ASCII 0. При успешном выполнении функция устанавливает флаг переноса CF в 0, а в регистр CX возвращается слово атрибутов файла (табл. 2.2). В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 1 – неверное значение в регистре AL, 2 – не найден файл, 3 – указан неверный путь, 5 – доступ запрещён.

2. Для установки новых атрибутов файла используется подфункция 01 h (помещается в регистр AL) функции 43 h (помещается в AH) прерывания 21 h. В регистр CX помещается новое слово атрибутов файла, в регистры DS: DX – указатель на строку с путём к файлу и именем файла, завершающуюся символом ASCII 0.

В случае успеха флаг переноса CF равен нулю, а для указанного файла устанавливаются новые атрибуты. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 1 – неверное значение в регистр AL, 2 – не найден файл, 3 – указан неверный путь, 5 – доступ запрещён.

Переименование файла. Для переименования файла используется функция 56 h прерывания 21 h. Регистры DS: DX содержат указатель на строку с путём к файлу и именем существующего файла, завершающуюся символом ASCII 0; регистры ES: DI – указатель на строку с путём к файлу и именем нового файла, завершающуюся символом ASCII 0. Имена накопителей, если они присутствуют, должны совпадать. Если пути к файлам не совпадают, то файл переносится в новый подкаталог. Для переноса файла без переименования в другой подкаталог необходимо указать одинаковые имена существующего и нового файлов, но разные пути. При успешном выполнении функции флаг переноса CF равен 0, а файл переименовывается. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 2 – не найден файл, 3 – указан неверный путь, 5 – доступ запрещён, 11 h – имена накопителей для старого и нового файлов не совпадают.

Чтение/ установка даты и времени последней модификации файла. 1. Получить дату и время последней модификации файла можно с помощью функции 57 h прерывания 21 h. В регистр BX помещается номер (дескриптор) ранее открытого файла. Если ошибок не возникло, то флаг переноса CF равен 0, в регистре CX возвращается время, в регистре DX – дата последней модификации файла. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 1 – недопустимое значение в AL, 6 – недопустимый номер файла.

Время и дата возвращаются в следующих форматах, представленных в табл. 2.3.

2. Для установки времени и даты последней модификации файла используется подфункция 01 h (помещается в регистр AL) функции 57 h (помещается в AH) прерывания 21 h. В регистр BX помещается номер (дескриптор) ранее открытого файла, в CX – новое время, в DX – новая дата (в форматах, указанных в табл. 2.3). Если ошибок не возникло, то флаг переноса CF равен 0, а для указанного файла устанавливаются новые значения последней модификации. В противном случае флаг переноса устанавливается в 1, а в регистр AX возвращается код ошибки: 1 – недопустимое значение в AL, 6 – недопустимый номер файла.

Таблица 2.3

Форматы времени и даты модификации файла

Время

Дата



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 88; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.136.165 (0.02 с.)