Страница 18 из 41 Метод дескриптора файла: Функция 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 ;уход на обработку ошибки |