Глава 5. Дисковые накопители.

Раздел 2. Работа с каталогами диска.

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

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

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

Средний уровень.

Функции работы через дескрипторы файлов, которые использовались для доступа к корневому каталогу {5.2.1} могут так же просто обращаться к любому подкаталогу. Чтобы вывести все содержимое каталога надо просто использовать функцию 4EH для поиска файлов *.*, а затем повторять поиск, используя функцию 4FH. Kогда больше не будет файлов, то будет установлен флаг переноса, а AL будет содержать 18. Kаждый раз, когда будет обнаружен очередной элемент, в DTA будет записана информация о файле, включая полный его путь (отмечаем использование DTA в функциях, использующих дескриптор файла). Следующий пример выводит полные пути всех обычных файлов подкаталога.
;---в сегменте данных
PATH DB 'A:MAMMALS\*.*',0
DTAH DB 256 DUP(?)
;---установка DTA
LEA DX,DTA ;DS:DX указывают на DTA
MOV AH,1AH ;функция установки DTA
INT 21H ;устанавливаем DTA
;---ищем первый файл
MOV AH,4EH ;номер функции
LEA DX,PATH ;указываем на строку пути
MOV CX,0 ;только нормальные атрибуты
INT 21H ;ищем *.*
JC ERROR ;обработка ошибок
;---выводим имя файла
NEXT_LINE: LEA BX,DTA ;BX указывает на DTA
ADD BX,30 ;смещение для имени файла
NEXT_CHAR: MOV DL,[BX] ;получаем символ из имени
CMP DL,0 ;проверка на конец строки
JE END_STR ;уход, если конец
MOV AH,2 ;иначе, выодим символ
INT 21H ;
INC BX ;увеличиваем указатель
JMP SHORT NEXT_CHAR ;следующий символ
;---возврат каретки/перевод строки в конце строки
END_STR: MOV AH,2 ;функция вывода символа
MOV DL,13 ;код возврата каретки
INT 21H ;выводим
MOV DL,10 ;код перевода строки
INT 21H ;выводим
;---ищем следующий файл
LEA DX,PATH ;указываем на строку пути
MOV AH,4FH ;номер функции
INT 21H ;ищем следующий файл
JC FINISHED ;если нет, то выход
JMP SHORT NEXT_LINE ;иначе выводим имя файла
FINISHED:


<~-5.2.2 Создание/удаление подкаталога.
Содержание
5.2.4 Получение/установка текущего каталога.-~>

Сайт управляется системой uCoz