Глава 5. Дисковые накопители.

Раздел 3. Подготовка к работе с файлами.

5.3.3 Открытие/закрытие файла.

"Открыть" файл - это значит создать небольшие блоки памяти, которые будут содержать информацию о файле и служить промежуточной станцией (буфером), через которую данные будут передаваться между файлом и памятью. Языки высокого уровня автоматически создают для Вас эти блоки, а язык ассемблера - нет. При открытии файла каталог проверяется на его наличие. Если файла найден, то MS DOS берет информацию из каталога о размере и дате создания файла. Затем, при закрытии файла, система обновляет информацию в каталоге. Закрытие файла также очищает все системные буфера переноса, посылая на диск оставшуюся информацию. Если Вы не закроете файл перед завершением программы, то это может привести к потере данных.

Если программа работает со многими файлами, то надо постоянно иметь ввиду сколько имеется одновременно открытых файлов. MS DOS 2.1 позволяет иметь до 99 одновременно открытых файлов, причем по умолчанию только 8 (измените это число с помощью команды MS DOS FILES). Бейсик позволяет иметь не более 15 открытых файлов. Kаждый файл занимает место для блока параметров и буфера. Поскольку память для каждого файла отводится отдельно перед тем, как файлы открываются, то эта память недоступна для программ, даже если указанное число файлов не используется в настоящий момент. По этой причине Вы можете экономить память, устанавливая максимально допустимое число открытых файлов именно таким, которое требуется, с помощью описанного метода.

Средний уровень.

MS DOS обеспечмвает различные функции для открытия и закрытия файла, в зависимости от того использовала ли программа для доступа к файлу метод управляющего блока файла или метод дескриптора файла. В обоих случаях могут быть открыты только файлы, которые существовали до этого. Для создания новых файлов существует специальная функция {5.3.2}. Метод FCB:

Функция 0FH прерывания 21H открывает существующий файл. Вы должны сначала создать управляющий блок файла, как показано в {5.3.5}. Перед открытием FCB должен содержать только имя файла и имя накопителя (0 = по умолчанию, 1 = A и т.д.). DS:DX должны указывать на FCB, а затем надо выполнить функцию. При возврате AL будет содержать 0, если файл успешно открыт и FF, если файл не найден. Если для указания накопителя используется 0, то он будет заменен на код, соответствующий накопителю по умолчанию.

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

Чтобы закрыть файл с помощью метода FCB, надо установить DS:DX на открытый FCB и вызвать функцию 10H прерывания 21H. При удаче информация о размере файла, дате и времени будет записана в каталог, а в AL будет возвращен 0. Однако если имя файла не будет обнаружено в каталоге или оно будет найдено в другой позиции, то изменения на диске будут индицированы возвратом FF в AL.
;---в сегменте данных
FCB DB 1,'FILENAMEEXT',25 DUP(0)
;---открытие файла
MOV AH,0FH ;номер функции
LEA DX,FCB ;DS:DX указывают на FCB
INT 21H ;открываем файл
CMP AL,0 ;проверка на ошибку
JNE OPEN_ERROR ;на обработку ошибки
. .
;---закрытие файла
MOV AH,10H ;номер функции
LEA DX,FCB ;DS:DX указывают на FCB
INT 21H ;закрываем файл
CMP AL,0 ;проверка на ошибку
JNE CLOSE_ERROR ;на обработку ошибки
Метод дескриптора файла:

Для открытия файлов используйте функцию 3DH прерывания 21H. DS:DX должны указывать на строку, дающую путь и имя файла, включая имя нкакопителя, если это необходимо. Вся строка должна быть не длиннее 63-х байтов и завершаться символом ASCII 0. В AL надо поместить код доступа, причем 0 открывает файл для чтения, 1 для записи, а 2 - для чтения/записи. При возврате AX будет содержать 16-битный номер файла, по которому файл впоследствии идентифицируется. Файловый указатель устанавливается на начало файла. Размер записи устанавливается равным 1 байту - это связано с тем, что операции прямого доступа при использовании метода дескриптора файла не имеют специальных буферов: на самом деле файлы с прямым доступом рассматриваются как последовательные и с ними работают одни и те же функции. Эта функция позволяет открывать как обычные, так и спрятанные файлы. При возврате флаг переноса равен 0, если файл открыт успешно. В противном случае флаг переноса устанавливается, а AX содержит 2 - если файл не найден, 4 - если программа хочет открыть слишком много файлов, 6 - при ошибке на диске и 12 - если неправильно указан код доступа в AL. Вот пример:
;---в сегменте данных
PATH DB 'A:LEVEL1\FILENAME.EXT',0
;---открываем файл для чтения/записи
MOV AH,3DH ;номер функции
MOV AL,2 ;открываем для чтения/записи
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;открываем файл
JC OPEN_ERROR ;уход на обработку ошибок
MOV HANDLE,AX ;сохраняем номер файла

Функция 3EH прерывания 21H закрывает файл, открытый методом дескриптора файла. Hадо просто поместить номер файла в BX и выполнить функцию. При возврате флаг переноса равен 0, если все в порядке, иначе он равен 1, а AX = 6, если указан неверный номер файла.
;---закрытие файла
MOV AH,3EH ;номер функции
MOV BX,HANDLE ;номер файла
INT 21H ;закрываем файл
JC CLOSE_ERROR ;уход на обработку ошибки

Функция 45H прерывания 21H создает второй дескриптор файла из существующего открытого дескриптора. В BX должен быть указан существующий номер, а в AX будет возвращен новый. Функция 46H прерывания 21H связывает второй дескриптор (помещаемый в CX) с открытым файлом (номер которого в BX) таким образом, что первый будет относиться к тому же файлу и устройству, что и последний.


<~-5.3.2 Создание/удаление файла.
Содержание
5.3.4 Переименование файла; изменение позиции файла в каталоге.-~>

Сайт управляется системой uCoz