Если файл уже существует, функция 3Ch все равно открывает его, присваивая ему нулевую длину. Чтобы этого не произошло, следует пользоваться функцией 5Bh.
Создание файла с усечением существующего до нулевой длины.
Запрещений нет
Чтение запрещено
Запись запрещена
Все операции запрещены
Режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости)
Чтение и запись
Запись
Чтение
биты 2 – 3: зарезервированы (0)
биты 6 – 4: режим доступа для других процессов
бит 7: файл не наследуется порождаемыми процессами
DS:DX = адрес ASCIZ-строки с полным именем файла
CL = маска атрибутов файлов
Вывод:
CF = 0 и АХ = идентификатор файла, если не произошла ошибка.
CF = 1 и АХ = код ошибки (02h — файл не найден, 03h — путь не найден, 04h — слишком много открытых файлов, 05h — доступ запрещен, 0Ch — неправильный режим доступа)
Пример:
LEA DX,PATH ; сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0;
; если краткое имя, то берется текущий каталог
MOV AL,2 ; открыть для чтения и записи, если 0 для чтения,
; 1 – для записи
MOV АН,3DН ; функция открытия файла
INT 21H ; открываем файл
JC ERRO ; ошибка, если поднят флаг СF, в АХ код ошибки,
; если ошибки нет, то в АХ описатель файла для
; будущей работы следует его сохранить
При этом обязательно будет ошибка, если такого файла не существует (в указанном каталоге).
Ввод:
Ah = 3Ch
СХ = атрибут файла
Бит 7: файл можно открывать разным процессам в Novell Netware
бит 6: не используется
бит 5: архивный бит (1, если файл не сохранялся)
бит 4: каталог (должен быть 0 для функции 3Ch)
бит 3: метка тома (игнорируется функцией 3Ch)
бит 2: системный файл
бит 1: скрытый файл
бит 0: файл только для чтения
Вывод:
DS:DX = адрес ASCIZ-строки с полным именем файла (ASCIZ-строка ASCII-символов, оканчивающаяся нулем).
CF = 0 и АХ = идентификатор файла, если не произошла ошибка
CF = 1 и АХ = 03h, если путь не найден
CF = 1 и АХ = 04h, если слишком много открытых файлов
CF = 1 и АХ = 05h, если доступ запрещен
Функция 5ВН создаёт файл, но если файл уже существует, содержимое его не уничтожается, а взводится флаг ошибки СF.
Пример:
LEA DX,PATH ; в сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0
; если краткое имя, то берется текущий каталог
MOV СХ,0 ; создать только для чтения, если 0 - для чтения, 1 –
; для записи
MOV АН,3СН ; функция создания файла
INT 21h ; открываем файл
JC ERRO ; ошибка, если поднят флаг СF, в АХ код ошибки,
; если ошибки нет, то в АХ описатель файла, для
; будущей работы следует его сохранить
Пример 10.1. Создание файла и запись в него строки 'Файл номер 1'.
; В сегменте данных
.data
bufout db 'Файл номер 1' ; Данные для записи в файл
buflen=$-bufout ; строка длиной в 12 байт
handle dw 0 ; Ячейка для дескриптора
fname db 'MYFILE.txt',0 ;Имя файла в формате ASCIIZ