Страница 23 из 41
5.3.5 Подготовка к файловым операциям. Языки высокого уровня, такие как Бейсик, выполняют подготови- тельную работу для файловых операций автоматически. Однако прог- раммы на языке ассемблера имеют достаточно работы перед тем как
создать или открыть файл. Требования отличаются, в зависимости от того используется ли для доступа к файлу метод управляющего блока файла или метод дескриптора файла. Для обоих методов Вам необхо- димо строку или блок параметров, указывающих на файл и буфер для переноса данных. MS DOS предоставляет различные наборы функций чтения/записи для двух методов.
Средний уровень. Метод управляющего блока файла: Этот метод доступа к файлам требует, чтобы Вы создали блок параметров, котрый первоначально должен содержать такую информа- цию, которая позволяет найти файл в каталоге. Хотя FCB имеет много полей, вообще говоря, только некоторые из них должны быть заполнены; MS DOS заполняет большинство остальных полей информа- цией после того, как файл открывается. Отметим, что к началу FCB может добавляться специальное поле для создания расширенного FCB, который объяняется ниже. Вот структура FCB:
Накопитель (DB) Число, определяющее на каком накопителе будет искаться файл, 1 = A, 2 = B и т.д. Если указан 0, то берется накопитель по умолчанию, а затем система заменяет 0 на код этого накопителя.
Имя и расширение Восьмибайтное имя файла, выравненное по (11 байтов) левому краю должно быть дополнено пробелами (ASCII 32), если оно меньше 8 байтов. То же относится и к трехбайтному расширению. Между ними не должна стоять точка.
Текущий блок (DW) DOS организует файлы блоками по 128 записей, пронумерованных от 0 до 127. Например, сис- тема рассматривает запись #129 файла прямого доступа, как запись #0 блока #1 (отсчет как для записей, так и для блоков ведется с 0). В файлах нет специальных ограничителей ни для блоков ни для записей. Вместо этого смещение для блоков и записей вычисляется исходя из длины записи, которая устанавли- вается следующим полем FCB.
Размер записи (DW) Все функции MS DOS, связанные с чтением или записью в файл, работают в терминах записи. Для файлов прямого доступа важно, чтобы размер записи был установлен равным размеру записей, помещенных в файл. Для последова- тельных файлов размер записи не столь важен, однако маленький размер записи будет замед- лять дисковые операции. Поскольку размер сектора 512 байтов, то оптимальным является размер записи 512 байтов. Система автомати-
чески помещает значение по умолчанию 80H (128) в поле длины записи при открытии фай- ла. Поэтому не забудьте установить это поле после открытия файла.
Размер файла (DD) Размер указывается с точностью до байта. Это поле заполняется системой при открытии фай- ла.
Дата файла (DW) Дата записывается системой при открытии FCB. Ее формат приведен в [5.2.5].
Текущая запись (DB) Текущая запись используется совместно с полем текущего блока. Записи нумеруются от 0 до 127. Запись прямого доступа #200, распо- ложенная в блоке 1, имеет номер текущей записи равный 71 ((200 - 128) - 1).
Номер записи пря- Вместо того, чтобы требовать от программы, мого доступа (DD) чтобы она вычисляла текущие значения блока и записи для файла прямого доступа, MS DOS делает эту работу сама. При операциях с файлами прямого доступа просто поместите номер записи в это 4-хбайтное поле. При выполнении операции с файлом прямого доступа
MS DOS поместит нужные значения в поля теку- щего блока и текущей записи. Помните, что старший байт расположен в старшей ячейке.
Связь между полями текущей записи, текущего блока и номер записи прямого доступа показана на рис. 5-3. Простейший путь создать FCB как переменную в сегменте данных программы. Если имя открываемого файла не меняется, то это имя может быть прямо записано в это поле. Остаток блока инициализи- руйте байтами ASCII 0. Только после того как FCB будет открыт (с помощью функции 0FH прерывания 21H, как показано в [5.3.3]) Вы должны записать в блок остальную информацию. Отметим, что FCB для работы с простым последовательным файлом с длиной записи 128 байтов не требует дальнейших приготовлений. После создания FCB дальнейшие операции требуют, чтобы DS:DX указывали на него. Прос- тейшая форма его такая:
FCB DB 1,'FILENAMEEXT',25 DUP(0)
Можно также создать FCB как структуру:
FCB STRUC DRIVE_NUM DB 0 FILE_NAME DB 8 DUP(?) FILE_EXT DB 3 DUP(?) BLOCK_NUM DW 0 RECORD_SIZE DW 0
FILE_SIZE DD 0 FILE_DATE DW 0 RESERVED DB 10 DUP(0) CURRENT_REC DB 0 RANDOM_REC DD 0 FCB ENDS
|