1. Работа с каталогами диска
для П ЭВМ типа IBM PC
в операционной системе MS
DOS.
2. Общие принципы
Уровни:
BIOS (нижний).
Обращение идёт непосредственно к драйверу диска.
Файловая система DOS не используется и требуемая
информация отыскивается не по имени файла, а по
номерам поверхности, цилиндра, сектора
DOS (верхний)
Реализуется с помощью прерывания DOS int 21h.
Программист работает не с драйвером диска, а с файловой
системой DOS, получая возможность оперировать с
понятиями логический диск, каталог, файл.
• При работе с диском рекомендуется по возможности
использовать функции DOS. Только в редких случаях,
например при нестандартном форматировании дискеты,
целесообразнее использовать прерывания BIOS.
3. Применение функций DOS для
работы с каталогами диска.
1. Организация файлов: древовидная иерархическая
структура.
Корень - корневой каталог, который расположен в
определённых секторах диска.
Каждая запись корневого каталога указывает на файлы или
другие подкаталоги.
Подкаталоги – это обычные файлы, которые хранятся в
любом месте диска.
Записи подкаталогов содержат ссылки на файлы и
подкаталоги более низкого уровня. Кроме этого,
подкаталоги содержат две записи, содержащие в поле
имени '.' и '..' и указывающих на сам подкаталог и на
подкаталог - родитель .Если в каталоге есть запись,
указывающая на подкаталог более низкого уровня, то в
этой записи в байте атрибута будет установлен бит 4,
а поле длины файла равно 0.
4. Метод дескриптора файла.
Файл в программе указывается с помощью ASCIIZ-строки, т.е. строки,
состоящей из символов ASCII и заканчивающейся кодом 0. Файл
должен обозначаться в виде, принятом в MS DOS.
Пример.
file db 'A: SYSTEM MY data.txt', 0 ; имя файла
DIRICT db 'C: SYS DAT ', 0 ; ASCIIZ-строка для каталога.
File1 db ‘my.dat’,0 ; файл в текущем каталоге.
«джокеры» – символы заполнители в имени файла
«?» заменяет конкретный символ,
«*» – целое имя.
Примеры.
*.COM – все файлы типа .COM;
PROG?.PAS – все файлы типа PROG1. PAS, PROG2.PAS, PROGA.PAS и
т.п.
В программе, для того, чтобы прочитать (записать) данные в файл
(каталог), в регистры DS:DX необходимо поместить адрес ASCIIZ-
строки с именем файла (каталога).
5. Основные операции над
каталогами
• Создание подкаталога (корневой
каталог создаётся автоматически при
форматировании диска)
• Удаление подкаталога
• Чтение корневого каталога или
подкаталога
6. Создание подкаталога
Функция 39h прерывания int 21h.
DS:DX указывает на ASCIIZ-строку с именем каталога и пути к нему
В случае ошибки CF=1 и AX содержит код ошибки
Создать подкаталог невозможно, если
• родительский каталог является корневым и он переполнен;
• неправильно указан путь к каталогу;
• каталог с таким же именем уже существует.
Пример.
…
lea dx, name_file
mov ah, 39h
int 21h
jс error
…
7. Удаление подкаталога
Функция 3Аh DOS прерывания int 21h.
DS:DX указывает на ASCII-строку с обозначением
удаляемого подкаталога. При ошибке CF=1 и AX
содержит код ошибки.
Операция невозможна, если:
• удаляемый подкаталог является текущим;
• удаляемый подкаталог содержит файлы;
• имя каталога задано неправильно.
Пример.
…
mov ah, 3ah
lea dx, file-name
int 21h
jc error
8. Чтение корневого каталога или
подкаталога
1.Используются две функции: 4eh и 4fh прерывания int 21h.
4eh - позволяет найти первое имя файла в каталоге
4fh – позволяет найти все последующие имена
файлов.
2. Содержимое регистров:
DS:DX – должны содержать указатель на ASCII-строку с
именем файла.
Строка может содержать «джокеры».
Например, для получения списка всех файлов
каталога B:SYSMY ASCIIZ- строка должна
иметь вид
DB file 'B: SYS MY *.* ', 0.
СХ - атрибут файла (0 – обычный).
9. 3. Перед выполнением функции 4eh с помощью функции 1Ah
должен быть установлен буфер передачи данного диска
DTA, в который будет помещено имя первого найденного
файла.
Содержимое регистров для функции 1ah:
DS:DX –указатель на область памяти, куда будет помещено
найденное имя (буфер DTA). Если 1ah не используется, то
по умолчанию DTA длиной 128 байт устанавливается в
PSP программы по смещению 0080h.
4. Если функция 4eh находит файл, то информация об этом
файле помещается в буфер DTA, в том числе по смещению
30 начинается полное имя найденного файла и его
расширение в виде ASCIIZ-строки. В случае ошибки CF=1
и в AX – код ошибки (02 – не найден файл, 18 – конец
поиска).
5. Для того, чтобы получить следующий файл каталога
можно использовать функцию 4Fh (после успешного
выполнения 4eh). Между функциями 4eh и 4fh область
DTA не должна меняться. DS:DX адресует ту же ASCIIZ-
строку, что и 4eh. Результат поиска возвращается в DTA.
Если файлов больше нет, то AX=18 и CF=1.
10. Пример.
Печать списка файлов каталога.
…
files db 'A:SYSMY*.* ', 0
DTA db 256 DUP(?)
……………..
; установить DTA
mov ah,1ah
lea dx, dta
int 21h
; найти первый файл каталога
lea dx, files
mov ah, 4eh
mov cx, 0 ; обычные файлы
int 21h
jc error
11. ; выводим имя файла
NEXT: lea bx, dta
аdd bx, 30 ; смещение для имени файла
Next_ch: mov dl, [bx] ; взять символ
CMP dl, 0 ; конец ASCII-строки?
JE END_N
MOV ah, 2 ; вывод символа
int 21h
inc bx ; bx=bx+1
JMP Next_ch
END_N: mov ah, 2
mov dl, 13 ; код <Enter>
int 21h
mov ah,2
mov dl,10 ; код <LF>
int 21h
; ищем следующий файл
lea dx, files
mov ah, 4fh
int 21h
Jc finish
JMP next
………
Error:
……..
finish: