Чтение/изменение корневого каталога.




 

Каталоги диска подразделяются на корневой каталог (обсуждаемый здесь) и подкаталоги (обсуждаемые в [5.2.3]). Когда пользователь программы вводит имя какого-либо файла для работы, то бывает полезным проверить, имеется ли этот файл на самом деле. Обычно изменения в корневом каталоге производятся в ходе обычных файловых операций или с помощью специальных функций DOS. Однако можно работать с каталогом напрямую. Большая нужда в таком подходе возникает при работе на языках высокого уровня, где утилиты DOS по большей части недоступны.

Корневой каталог читается и изменяется загрузкой его в память с использованием подхода, показанного в [5.4.2], когда читаются абсолютные сектора диска. Эти операции не оставляют места между секторами, когда они загружаются в память. Буфер, содержащий данные сектора, может рассматриваться как набор 32-байтных полей и пара указателей, которые могут использоваться для движения по каталогу. Один указатель всегда кратен 32 и указывает на начало элемента каталога. Второй указатель добавляется к первому и указывает на одно из полей в 32-байтном элементе. Данные в памяти могут быть изменены требуемым образом, а затем весь буфер записывается обратно на диск.

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

MS DOS обеспечивает две пары функций для поиска файлов, одна для файлов, открытых методом управляющих блоков файла, а другая - для файлов, открытых методом дескриптора файлов. Одна из функций каждой пары ищет первое появление имени файла в каталоге, а другая ищет последующие появления, когда в имени файла содержатся джокеры. Только метод, использующий дескриптор файла позволяет искать подкаталоги.

 

Метод FCB:

 

Функция 11Н прерывания 21H ищет первое появление файла. Установите DS:DX на неоткрытый FCB и выполните функцию. При возврате AL будет содержать 0, если файл найден, и FF - если нет. DTA заполняется информацией из каталога. Для обычных FCB первый байт DTA содержит номер накопителя (1=А и т.д.), а следующие 32 байта содержат элемент каталога. Для расширенного FCB первые 7 байтов файла копируются в первые 7 байтов расширенного FCB, восьмой байт указывает на накопитель, а следующие 32 байта - элемент каталога.

;---в сегменте данных

FCB DB l,NEWDATABAK',25DUP(0)

;---ищем файл

MOV АH,11H;функция поиска в каталоге

LEA DX,FCB;указываем на FCB

INT 21Н;ищем

CMP AL,0;успешно?

JNE NO_FILE;если нет, то процедура обработки ошибки

LEA BX,DTA;теперь DS:BX указывает на элемент каталога

После использования функции 11Н можно использовать функцию 12Н для поиска следующих подходящих элементов, когда имя файла содержит джокеры. В данном случае в имени файла допустим только символ "?", но не "*". Эта функция работает в точности так же, как и первая, и если найден второй файл, то информация о первом файле в DTA будет уничтожена повторной записью.

 

Метод дескриптора файлов:

 

Функция 4ЕН прерывания 21Н ищет файл с данным именем. DS:DX должны указывать на строку, дающую путь файла. Например, B:\EURO-PE\FRANCE\PARIS указывает на файл PARIS. Строка может содержать до 63 символов и завершаться символом ASCII 0. Имя файла может содержать джокеры, включая как "?", так и "*". Поместите атрибут файла в СХ; если он обычный то 0, в противном случае проконсультируйтесь в [5.2.6] относительно значений атрибута.

При возврате устанавливается флаг переноса, если файл не найден. Если файл найден, то функция заполняет DTA информацией о файле. Отметим частный случай использования DTA методом дескриптора файлов - обычно, DTA используется функциями MS DOS для работы через FCB. Первые 21 байт DTA зарезервированы DOS для поиска следующих совпадающих файлов. Двадцать второй байт дает атрибут файла, за ним следуют два байта, содержащие время и еще два байта содержащие дату. Следующие 4 байта содержат размер файла (младшее слово сначала). И, наконец, дается имя файла в виде строки переменной длины, заканчивающейся байтом ASCII 0. Точка (ASCII 46) разделяет имя и расширение и не один из этих элементов не заполнен пробелами.

;—в сегменте данных

PATH DB B:FRANCE\PARIS\4EME',0;—ищем файл

MOV АН,4ЕН;номер функции

LEA DX,PATH;DS:DX указывают на путь

MOV СХ,0;обычный атрибут файла

INT 21Н;ищем файл

JC NO_FILE;уход, если не найден

LEA BX,DTA;DS:BX указывают на DTA

MOV AL,[BX]+21;теперь атрибут файла в AL

Следующее появление имени файла (когда используются джокеры) ищется с помощью функции 4FH прерывания 21Н. Она готовится в точности так же, как и функция 4ЕН, при этом указатель DTA не должен меняться. Когда других совпадений не найдено, то устанавливается флаг переноса, а в АХ появляется 18.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: