Шаг 57.
Функции базовой версии DOS для работы с файлами. Создание файла, последовательная запись и закрытие файла

    На этом шаге мы рассмотрим функции, осуществляющие создание файла, запись данных и его закрытие.

    Для ссылки на каждый дисковый файл программа должна содержать правильно составленный блок управления файлом. Операции ввода-вывода на диск требуют установки адреса блока FCB в регистре DX. Доступ к полям блока FCB осуществляется по этому адресу с помощью регистровой пары DS:DX.

    Для создания нового файла программа использует функцию 16H в прерывании DOS INT 21H следующим образом:

    MOV  AH,16H     ; Создание
    LEA  DX,FILE    ; дискового файла.
    INT  21H        ; Вызов DOS-прерывания.
(FILE - имя блока FCB).

    DOS осуществляет поиск имени и типа файла, взятого из соответствующих полей FCB, в оглавлении. Если элемент оглавления, содержащий необходимое имя и тип, будет найден, то DOS очищает найденный элемент для нового использования. Если такой элемент отсутствует в текущем каталоге, то DOS его "создает". Затем операция устанавливает размер файла в 0 и "открывает" файл. На этапе открытия происходит проверка доступного дискового пространства. Ее результат устанавливается в регистре AL:

    При открытии также устанавливается в FCB номер текущего блока - 0 и размер записей (по умолчанию) - 128 (80H) байтов. Прежде чем начать запись в файл, можно заменить это значение по умолчанию на требуемый размер записей.

    Для осуществления обмена данными с файлом используется специальная область, называемая областью передачи данных (DTA - Disk Transfer Area). Так, например, для записи данных в файл нужно разместить эти данные в DTA, откуда, при выполнении соответствующей команды, они будут взяты и помещены в файл.

    Так как блок FCB содержит размер записей, то в DTA не требуется устанавливать ограничитель конца записи. С помощью функции 1AH необходимо сообщить DOS адрес DTA. В любой момент времени может быть активна только одна область DTA. В следующем примере устанавливается адрес DTA:

    MOV  AH,1AH     ; Установка адреса
    LEA  DX,DTAname ;           DTA.
    INT  21H        ; Вызов DOS-прерывания.

    Для последовательной записи на диск существует функция 15H:

    MOV  AH,15H     ; Последовательная
    LEA  DX,FILE    ;    запись.
    INT  21H        ; Вызов DOS-прерывания.

    Операция записи использует информацию из блока FCB и адрес текущего буфера DTA. Если длина записи равна или кратна размеру кластера, то запись заносится на диск. В противном случае записи заполняют буфер и затем его содержимое записывается на диск. Например, если длина каждой записи составляет 128 байтов, то буфер заполняется четырьмя записями (4*128=512) и затем он записывается в кластер (при условии, что размер кластера совпадает с размером сектора).

    После успешного занесения записи на диск DOS увеличивает в блоке FCB размер файла на размер записи и текущий номер записи на 1. Когда номер текущей записи достигает 128, происходит сброс этого значения в 0 и в FCB увеличивается номер текущего блока на 1. Операция возвращает в регистре AL следующие коды:

    Для закрытия файла используется функция 10H:

    MOV  AH,10H     ; Закрыть
    LEA  DX,FILE    ;   файл.
    INT  21H        ; Вызов DOS-прерывания.

    Эта операция записывает на диск данные, которые ещё остались в дисковом буфере DOS, и изменяет в соответствующем элементе оглавления, дату и размер файла. В регистре AL возвращаются следующие значения:

    На следующем шаге мы рассмотрим последовательное чтение из файла.




Предыдущий шаг Содержание Следующий шаг