Предыдущий раздел ОПЕРАЦИИ С ФАЙЛАМИ Следующая глава

16.2. Создание и открытие файла

Работа с любым файлом начинается с его создания. Оно выполняется ОС по соответствующей просьбе со стороны программы. Во время создания файла добавляется новая запись в “родительский” каталог, заданный программой. В эту запись помещается простое имя файла, а также другая информация, соответствующая типу используемой файловой системы (ФС). Например, при включении файла в систему FAT, в запись каталога помещаются атрибуты нового файла. (Многие другие файловые системы размещают атрибуты файла не в каталоге, а в своих таблицах.)

Кроме того, при создании файла в ФС со статическим распределением ВП файлу выделяется необходимое пространство на носителе. В ФС с динамическим распределением памяти (к которым относится и FAT) память файлу при его создании не выделяется, а его длина принимается нулевой.

Создание файла является необходимым, но недостаточным условием выполнения информационного обмена с ним. Для этого требуется выполнить также открытие файла. Во время этой операции происходит связывание реального физического файла на носителе ВП (или файла-устройства ввода/вывода) с соответствующим логическим файлом.

Программа, по запросу которой ОС выполняет открытие файла, должна сообщить в системном запросе не только имя открываемого физического файла, но и тип последующей работы с ним (чтение или запись). В качестве результата открытия файла в программу возвращается логический номер файла. Рассмотрим теперь внутреннюю работу ОС при открытии файла.

Во-первых, во время открытия файла ОС создает для работы с ним столько буферов, сколько типов операций информационного обмена с ним будут выполняться. Поэтому при открытии файла и на чтение, и на запись, ему выделяются два буфера, а при открытии только на чтение – один. Размер системных буферов кратен одному сектору и обычно равен одному кластеру диска.

Во-вторых, ОС помещает БУФ (блок управления файлом) в свою таблицу открытых файлов. БУФ содержит атрибуты файла (переписываются из каталога), а также указатели на системные буферы для работы с ним.

В-третьих, ОС просматривает таблицу логических номеров файлов для данной программы и выбирает из этой таблицы первый свободный элемент (содержит FFh). В этот элемент помещается номер соответствующего БУФ в таблице открытых файлов. После этого ОС возвращает управление в программу, передав ей в качестве логического номера файла номер элемента в таблице логических номеров. Таким образом, в результате открытия файла создается путь от логического номера файла в программе до физического файла на носителе (рис.53).

Для программы, выполняемой в среде DOS, таблица логических номеров файлов содержится в PSP программы, начиная с адреса-смещения 18h. Размер этой таблицы равен 20 байтам (по одному байту на номер файла). Поэтому общее число файлов, открытых в программе, не может превышать 20. Из этих номеров первые пять DOS использует сама, открывая для программы (до начала ее выполнения) следующие файлы:

 0 – стандартное устройство ввода (обычно клавиатура);

 1 – стандартное устройство вывода (обычно экран);

 2 – устройство вывода сообщений об ошибках (экран);

 3 – последовательный порт (обычно COM1);

 4 – параллельный порт (обычно LPT1).

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

 

Рис.53. Результат операции открытия файла

 

Другим ограничителем числа открытых файлов является строка “FILES=N “ в командном файле конфигурации системы Config.sys (для MS-DOS) или Fdconfig.sys (для FreeDOS). Число N задает предельное суммарное число файлов, открытых во всей системе. Именно столько строк имеет таблица открытых файлов. Последнее ограничение нетрудно скорректировать, используя любой текстовый редактор.

В отличие от таблицы логических номеров таблица открытых файлов является внутренней таблицей DOS, к которой прикладные программы не имеют непосредственного доступа. Работу с этой таблицей выполняют только подпрограммы ОС, инициируемые в результате системных вызовов. Для создания и открытия файлов используются следующие системные вызовы DOS: “int 21h” (функция 3Ch) и “int 21h” (функция 3Dh).

int 21h (функция 3Ch) – создание и открытие файла. Данный вызов создает и открывает новый файл. Если указанный файл уже существует, то он усекается до нулевой длины. Перед применением вызова программа помещает в какую-то область ОП символьную строку, представляющую собой имя создаваемого файла. Эта строка должна заканчиваться нулевым байтом. При этом имя файла может быть задано в любой из допустимых форм: имя-путь, предваряемое именем логического диска; имя-путь; относительное имя файла; простое имя.

В регистры DS и DX программа должна поместить соответственно адрес-сегмент и адрес-смещение области памяти с именем файла. В регистр CX должна быть помещена битовая строка, задающая особые свойства создаваемого файла. При этом установка каждого бита задает одно особое свойство (атрибут) файла. Например, “бит1 = 1 требует, чтобы файл был скрытым (его имя не должно выводиться на экран при выполнении утилиты DIR).  Если создается обыкновенный файл, то все биты-атрибуты должны быть нулевыми.

При успешном завершении системного вызова в программу возвращается флаг FC=0. При этом в регистре AX возвращается логический номер файла.

int 21h (функция 3Dh) – открытие существующего файла. Перед применением вызова программа задает в регистрах DS и DX адрес имени открываемого файла (аналогично функции 3Ch). В регистр AL она помещает режим доступа к файлу. Младшие биты 0-1 режима доступа  задают допустимые операции с открытым файлом:

00 – открыть для чтения;

01 – открыть для записи;

10 – открыть для чтения и для записи.

При успешном завершении системного вызова в программу возвращается флаг FC=0, а в регистре AX передается логический номер файла.

 


Предыдущий раздел В начало Следующая глава