Смекни!
smekni.com

Работа с каталогами и подкаталогами, работа с файлами (стр. 2 из 3)

Метод 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.

1.3 Создание/удаление подкаталога.

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

Поскольку управляющие блоки файлов обслуживают только корневой каталог, то для создания или удаления подкаталога надо использовать дескрипторы файлов.

Создание подкаталога:

DS:DX должны указывать на строку, дающую накопитель и путь к каталогу, в котором должен быть создан подкаталог. Строка должна завершаться байтом ASCII 0. Для открытия подкаталога с именем PRIMATES в корневом каталоге накопителя А: надо записать строку в виде "A:\PRIMATES". Для открытия подкаталога в другом подкаталоге с именем MAMMALS напишите "A:\MAMMALS\PRIMATES". Имя накопителя А: может быть опущено если Вы работаете с накопителем, используемым по умолчанию, и путь может начинаться с текущего каталога. Поместите в АН 39Н и выполните прерывание 21Н; если указан правильный путь, то будет создан новый каталог. В противном случае будет установлен флаг переноса, а АХ будет содержать код ошибки 3 (путь неверен) или 5 (нет доступа). В примере создается подкаталог PRIMATES:

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

PATH DB 'A:MAMMALS\PRIMATES',0

;---создаем подкаталог с именем PRIMATES

LEA DX,PATH ;DS:DX должны указывать на путь

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

INT 21Н ;создаем подкаталог

JC ERROR_ROUT ;обработка ошибок

Удаление подкаталога:

Для удаления подкаталога надо сформировать строку, в точностью совпадающую с той, которую Вы указывали при создании каталога. Затем поместите в АН ЗАН и выполните прерывание 21Н. Опять при невыполнении функции в АХ будут возвращены коды 3 или 5 (код 5 может указывать, что каталог непустой).

1.4 Чтение/изменение подкаталога.

Подкаталоги во многом подобны корневому каталогу, за исключением того, что они хранятся как обычные файлы, а не в заранее предопределенных секторах. Подкаталоги невозможно спутать с обычными файлами, поскольку объект каталога, относящийся к подкаталогу, имеет специальный байт атрибутов (с установленным битом 5 - см. [5.2.6]). Подкаталоги начинаются с двух специальных 32-байтных объектов, первый из которых имеет имя точка, а второй - две точки. Они ориентируют подкаталог среди окружающих каталогов. Ссылки на подкаталоги нижнего уровня записываются как обычные ссылки на файлы.

Предполагается, что подкаталог может быть прочитан как любой другой файл, поэтому вроде бы не составляет труда загрузить его в память. Но, к сожалению, создатели MS DOS поместили 0 в поле длины файла для элементов, относящихся к подкаталогам. В результате DOS считает, что этот файл имеет нулевую длину и отказывается читать его. Нет простого способа преодолеть эту проблему.

Функции работы через дескрипторы файлов, которые использовались для доступа к корневому каталогу [5.2.1] могут так же просто обращаться к любому подкаталогу. Чтобы вывести все содержимое каталога надо просто использовать функцию 4ЕН для поиска файлов *.*, а затем повторять поиск, используя функцию 4FH. Когда больше не будет файлов, то будет установлен флаг переноса, a AL будет содержать 18. Каждый раз, когда будет обнаружен очередной элемент, в DTA будет записана информация о файле, включая полный его путь (отмечаем использование DTA в функциях, использующих дескриптор файла). Следующий пример выводит полные пути всех обычных файлов подкаталога.

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

PATH DB 'A:MAMMALS\*.*',0

DTAH DB 256DUP(?)

;---установка DTA

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

MOV AH,1АН ;функция установки DTA

INT 21H ;устанавливаем DTA

;---ищем первый файл

MOV AH,4EH ;номер функции

LEA DX,PATH ;указываем на строку пути

MOV СХ,0 ;только нормальные атрибуты

INT 21Н ;ищем *.*

JC ERROR ;обработка ошибок

;---выводим имя файла

NEXT_LINE: LEA BX,DTA ;ВХ указывает на DTA

ADD ВХ,30 ;смещение для имени файла

NEXT_CHAR: MOV DL,[BX] ;получаем символ из имени

CMP DL,0 ;проверка на конец строки

JE ENDSTR ;уход, если конец

MOV АН,2 ;иначе, выводим символ

INT 21H ;

INC BX ;увеличиваем указатель

JMP SHORT NEXT_CHAR ;следующий символ

;--- возврат каретки/перевод строки в конце строки

END_STR: MOV АН,2 ;функция вывода символа

MOV DL,13 ;код возврата каретки

INT 21H ;выводим

MOV DL,10 ;код перевода строки

INT 21Н ;выводим

;---ищем следующий файл

LEA DX,PATH ;указываем на строку пути

MOV AH,4FH ;номер функции

INT 21Н ;ищем следующий файл

JC FINISHED ;если нет, то выход

JMP SHORT NEXT_LINE ;иначе выводим имя файла

FINISHED:


II. Практическая часть

По условию нам необходимо написать программу, производящую создание, удаление, чтение, изменение каталогов.

В начале нашей программы, мы устанавливаем текущий каталог при помощи функции ЗВН 21-ого прерывания. Для выполнения данной функции нам необходимо указать адрес строки из сегмента данных со значением пути к необходимому каталогу в виде строки ASCII, в конце код 0. Также ставим условие обработки ошибок (если ошибка (CF=1), то в АХ - код ошибки).

Затем, с помощью функции 47Н 21-ого прерывания, читаем полный путь к текущему каталогу. Для входных параметров нам понадобиться в DL указать необходимый дисковод, а также поставим SI указывать на 64 байтовую переменную CURRENT_DIR, которая, собственно, и будет хранить путь к текущему каталогу. Далее эту переменную мы выведем на экран. Следует заметить, что функция возвращает строку без имени накопителя.

Теперь перейдем к созданию подкаталога. Для этого нам понадобиться 39-ая функция 21-ого прерывания. Здесь нам всего лишь необходимо чтобы DX указывал на нашу строку с путем (именем) каталога, в конец пишем код 0.

Далее для демонстрации функции вывода содержимого подкаталога, создадим в созданном нами каталоге 3 файла функцией ЗсН 21-ого прерывания. Затем перейдем к процедуре вывода содержимого подкаталога на экран.

Для начала определим адрес области обмена с диском (DTA) для последующих операций с блоками управления файлами. С помощью функции 1АН 21-ого прерывания установим DTA как область памяти из 256 байт с неопределенным значением.

Чтобы вывести все содержимое каталога на экран, необходимо использовать функцию 4ЕН 21-ого прерывания для поиска файлов *.*, а затем повторять поиск, используя функцию 4FH. Когда больше не будет файлов, то будет установлен флаг переноса, a AL будет содержать 18. Каждый раз, когда будет обнаружен очередной элемент, в DTA будет записана информация о файле, включая полное его имя.


Заключение

В данной курсовой работе была рассмотрена задача создание, удаление, чтение, изменение каталогов. Мы вывели на экран все содержимое каталога, теперь можно его удалить. Для удаления каталога мы сформировали такую же строку пути, которые мы указывали при создании каталога. По функции 3АН 21-ого прерывания наш каталог был удален, заметим, что каталог не будет удален, если он будет содержать какие-либо файлы, поэтому прежде удалили оттуда все файлы и выполнили функцию.