Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Создание/удаление файла. Часть 2
ОГЛАВЛЕНИЕ
Метод дескриптора файла:
Функция 3CH прерывания 21H создает и открывает новый файл
методом дескриптора файла. DS:DX должны указывать на строку,
дающую путь к файлу и имя файла в стандартном формате MS DOS,
включая имя накопителя, если файл находится не на накопителе по
умолчанию. Строка должна завершаться байтом ASCII 0. Байт атрибу-
тов файла [5.2.6] поместите в CX (0 - для нормального файла).
Затем выполните функцию. При успешном выполнении флаг переноса
будет равен нулю, а в AX будет возвращен номер нового файла. При
возникновении ошибки флаг переноса устанавливается в 1, а в AX
содержится код ошибки, который может быть равен 3, если не найден
путь, 4 - если уже открыты все буфера для файлов и 5 - если ката-
лог полон или файл уже существует со статусом только для чтения.
Отметим, что если в каталоге уже существует файл с таким именем,
то существующий файл обрезается до нулевой длины, и тем самым
разрушается. Для избежания ошибок надо предварительно использо-
вать функцию 4EH прерывания 21H для проверки.
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\FILENAME.EXT',0
;---проверка наличия файла в каталоге
MOV AH,4EH ;функция поиска в каталоге
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;проверка наличия файла
JNC WARN_USER ;если есть, то сообщаем
;---создание файла
MOV AH,3CH ;функция создания файла
MOV CX,0 ;нормальные атрибуты
INT 21H ;создаем файл
JC OPEN_ERROR ;уход на обработку ошибки
MOV HANDLE,AX ;запоминаем номер файла
В MS DOS 3.0 добавлена новая функция для создания файла мето-
дом дескриптора файла. Это функция номер 5BH прерывания 21H. Она
работает в точности так же, как и описанная функция 3CH, за иск-
лючением того, что она возвращает расширенные коды ошибок, что
позволяет лучше обрабатывать ошибочные ситуации. Они объяснены в
[7.2.5].
Для уничтожения файла методом дескриптора файла используйте
функцию 41H прерывания 21H. И опять DS:DX должны указывать на
строку, дающую путь и имя файла. Джокеры в имени файла не допус-
каются. Затем вызовите функцию. Если при возврате флаг переноса
установлен, то функция не выполнена; в этом случае AL будет со-
держать 2, если файл не найден и 5 - если произошла ошиька на
диске. Отметим, что с помощью этой функции Вы не можете удалить
файл со статусом только для чтения; измените атрибуты файла
[5.2.6] перед его удалением. Вот пример:
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\FILENAME.EXT',0
;---уничтожаем файл
MOV AH,41H ;номер функции уничтожения
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;уничтожаем файл
JC DELETE_ERROR ;на обработку ошибки
MS DOS версии 3.0 имеет специальную функцию (5AH прерывания
21H) для создания временного "безымянного" файла. Операционная
система сама генерирует имя для файла и проверяет, что такого
файла еще нет в каталоге. При этом исключается всякая возможность
что при создании временного файла будет разрушен существующий
файл с совпадающим именем. При входе DS:DX должны указывать на
строку пути к каталогу, в котором должен быть создан временный
файл. Строка должна завершаться обратной косой чертой. Поместите
атрибуты файла в CX (обычно 0). При возврате AX будет содержать
номер файла, если только флаг переноса не установлен, в этом
случае AX содержит информацию об ошибке. Произвольное имя файла
добавляется к концу строки пути. Эта функция может возвращать
расширенные коды ошибок, которые существуют только в MS DOS 3.0;
они объясняются в [7.2.5]. Файл, созданный этой функцией не унич-
тожается автоматически - программа должна использовать функцию
41H (см. выше). В данном примере программа создает временный
файл, а затем уничтожает его:
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\',12 DUP(0)
;---создаем временный файл
MOV AH,5AH ;номер функции
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;создаем временный файл
JC CREATION_ERROR ;уход на обработку ошибки
.
.
MOV AH,41H ;номер функции
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;уничтожаем временный файл
JC DELETION_ERROR ;уход на обработку ошибки