ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3171
Скачиваний: 1
включая имя накопителя, если файл находится не на накопителе по
умолчанию. Строка должна завершаться байтом ASCII 0. Байт атрибу-
тов файла [5.2.6] поместите в CX (0 - для нормального файла).
Затем выполните функцию. При успешном выполнении флаг переноса
будет равен нулю, а в AX будет возвращен номер нового файла. При
возникновении ошибки флаг переноса устанавливается в 1, а в AX
содержится код ошибки, который может быть равен 3, если не найден
путь, 4 - если уже открыты все буфера для файлов и 5 - если ката-
лог полон или файл уже существует со статусом только для чтения.
Отметим, что если в каталоге уже существует файл с таким именем,
то существующий файл обрезается до нулевой длины, и тем самым
разрушается. Для избежания ошибок надо предварительно использо-
вать функцию 4EH прерывания 21H для проверки.
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\FILENAME.EXT',0
;---проверка наличия файла в каталоге
MOV AH,4EH ;функция поиска в каталоге
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;проверка наличия файла
JNC WARN_USER ;если есть, то сообщаем
;---создание файла
MOV AH,3CH ;функция создания файла
MOV CX,0 ;нормальные атрибуты
INT 21H ;создаем файл
JC OPEN_ERROR ;уход на обработку ошибки
MOV HANDLE,AX ;запоминаем номер файла
В MS DOS 3.0 добавлена новая функция для создания файла мето-
дом дескриптора файла. Это функция номер 5BH прерывания 21H. Она
работает в точности так же, как и описанная функция 3CH, за иск-
лючением того, что она возвращает расширенные коды ошибок, что
позволяет лучше обрабатывать ошибочные ситуации. Они объяснены в
[7.2.5].
Для уничтожения файла методом дескриптора файла используйте
функцию 41H прерывания 21H. И опять DS:DX должны указывать на
строку, дающую путь и имя файла. Джокеры в имени файла не допус-
каются. Затем вызовите функцию. Если при возврате флаг переноса
установлен, то функция не выполнена; в этом случае AL будет со-
держать 2, если файл не найден и 5 - если произошла ошиька на
диске. Отметим, что с помощью этой функции Вы не можете удалить
файл со статусом только для чтения; измените атрибуты файла
[5.2.6] перед его удалением. Вот пример:
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\FILENAME.EXT',0
;---уничтожаем файл
MOV AH,41H ;номер функции уничтожения
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;уничтожаем файл
JC DELETE_ERROR ;на обработку ошибки
MS DOS версии 3.0 имеет специальную функцию (5AH прерывания
21H) для создания временного "безымянного" файла. Операционная
система сама генерирует имя для файла и проверяет, что такого
файла еще нет в каталоге. При этом исключается всякая возможность
что при создании временного файла будет разрушен существующий
файл с совпадающим именем. При входе DS:DX должны указывать на
строку пути к каталогу, в котором должен быть создан временный
файл. Строка должна завершаться обратной косой чертой. Поместите
атрибуты файла в CX (обычно 0). При возврате AX будет содержать
номер файла, если только флаг переноса не установлен, в этом
случае AX содержит информацию об ошибке. Произвольное имя файла
добавляется к концу строки пути. Эта функция может возвращать
расширенные коды ошибок, которые существуют только в MS DOS 3.0;
они объясняются в [7.2.5]. Файл, созданный этой функцией не унич-
тожается автоматически - программа должна использовать функцию
41H (см. выше). В данном примере программа создает временный
файл, а затем уничтожает его:
;---в сегменте данных
PATH DB 'B:LEVEL1\LEVEL2\',12 DUP(0)
;---создаем временный файл
MOV AH,5AH ;номер функции
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;создаем временный файл
JC CREATION_ERROR ;уход на обработку ошибки
.
.
MOV AH,41H ;номер функции
LEA DX,PATH ;DS:DX указывают на путь
INT 21H ;уничтожаем временный файл
JC DELETION_ERROR ;уход на обработку ошибки
5.3.3 Открытие/закрытие файла.
"Открыть" файл - это значит создать небольшие блоки памяти,
которые будут содержать информацию о файле и служить промежуточ-
ной станцией (буфером), через которую данные будут передаваться
между файлом и памятью. Языки высокого уровня автоматически соз-
дают для Вас эти блоки, а язык ассемблера - нет. При открытии
файла каталог проверяется на его наличие. Если файла найден, то
MS DOS берет информацию из каталога о размере и дате создания
файла. Затем, при закрытии файла, система обновляет информацию в
каталоге. Закрытие файла также очищает все системные буфера пере-
носа, посылая на диск оставшуюся информацию. Если Вы не закроете
файл перед завершением программы, то это может привести к потере
данных.
Если программа работает со многими файлами, то надо постоянно
иметь ввиду сколько имеется одновременно открытых файлов. MS DOS
2.1 позволяет иметь до 99 одновременно открытых файлов, причем по
умолчанию только 8 (измените это число с помощью команды MS DOS
FILES). Бейсик позволяет иметь не более 15 открытых файлов. Каж-
дый файл занимает место для блока параметров и буфера. Поскольку
память для каждого файла отводится отдельно перед тем, как файлы
открываются, то эта память недоступна для программ, даже если
указанное число файлов не используется в настоящий момент. По
этой причине Вы можете экономить память, устанавливая максимально
допустимое число открытых файлов именно таким, которое требуется,
с помощью описанного метода.
Высокий уровень.
При открытии файла в Бейсике идет поиск в каталоге и если файл
не найден, то создается новый файл с данным именем. Имеется два
способа записи оператора открытия файла и в большинстве случаев
оба эти способа эквивалентны. Единственное отличие состоит в том,
что один из этих способов более закодирован, в то время как дру-
гой ближе к естественному языку. В обоих операторах Вы должны
указать по меньшей мере три сорта информации. Во-первых требуется
имя файла и, поскольку это строка, оно должно быть заключено в
кавычки. Во-вторых, число, начиная с 1, присваивается файлу, как
идентификационный номер, по которому другие операторы читают или
пишут в файл. И в-третьих Вы должны указать для какой цели откры-
вается данный файл, т.е. открыт ли он для прямого или для после-
довательного доступа. Для открытия файла MYFILE.TXT для записи в
последовательный файл, причем этот файл будет иметь номер 2,
запишите или
OPEN "O",#2,"MYFILE.TXT"
или
OPEN "MYFILE.TXT" FOR OUTPUT AS #2
Отметим, что в обоих случаях номер 2 относится к буферу файла #2.
Число может быть любым, не превосходящим числа разрешенных буфе-
ров для файлов. Если поддерживается одновременная работа с шестью
файлами, то число должно быть в интервале от 0 до 6. Однако буфер
файла номер 1 не обязательно использовать раньше, чем файла номер
2. По умолчанию Бейсик устанавливает число буферов равное 8, но
Вы можете изменить это число на другое от 4 до 15. Из этих файлов
четыре используются Бейсиком для своих нужд, поэтому по умолчанию
только 4 файла доступны Вам для ввода/вывода. Для того чтобы
установить число доступных буферов используйте параметр F: при
запуске Бейсика. Например, если Вы при старте Бейсика напишите
BASICA/F:10, то будет создано 10 буферов, шесть из которых дос-
тупны для файловых операций.
Второй параметр, S:, устанавливает размер буферов файла. Все
буфера имеют один и тот же размер. По умолчанию берется размер в
128 байтов, однако допустимы размеры до 32767 байтов. Для файлов
последовательного доступа этот размер может быть установлен рав-
ным 0, что позволяет немного сэкономить память. Для файлов прямо-
го доступа он должен быть не меньше максимального размера записи.
Отметим, что есчи размер записи равен 512 байтам и размер буфера
тоже 512 байт, то это приводит к ускорению дисковых операций.
Команда BASICA/S:512/F:10 открывает 10 буферов размером 512 байт.
Каждый файл требует 188 байтов плюс размер буфера, поэтому для
такой конфигурации потребуется 7K памяти. Число буферов не может
быть больше, чем разрешено иметь открытых файлов в DOS.
Кодированная форма:
Первая из форм оператора OPEN использует одну букву для обоз-
начения желаемого типа операций над файлом. Имеется три возмож-
ности:
"O" открыть файл с последовательным доступом для вывода
"I" открыть файл с последовательным доступом для ввода
"R" открыть файл с прямым доступом для ввода/вывода
Последовательные файлы не могут записываться, когда они открыты
для чтения и наоборот. В типичных случаях, последовательные файлы
открываются для чтения, затем считываются целиком в память и
закрываются. После того как необходимые изменения внесены, файл
снова открывается, но теперь для вывода и записываетсяобратно на
диск, перекрывая то, что было записано в его секторах и, возмож-
но, захватывая новые сектора.
Следует отметить несколько моментов, относящихся к этой форме
оператора OPEN. Имя файла должно содержать имя накопителя, если
файл не найден на накопителе по умолчанию (т.е. накопителе, с
которого запущен Бейсик). Имя файла может также содержать путь к
файлу, находящемуся в подкаталоге, например OPEN "I",#1,"A:\LE-
VEL1\LEVEL2\MYFILE.TXT". Кроме того, Вы можете поместить указание
размера записи в конце оператора OPEN "R",#3,"MYFILE.TXT",52. В
этом случае каждая запись будет занимать 52 байта дискового
пространства. Если в операторе FIELDS не используются все 52
байта, то остаток пропадет. Этот параметр существенен при опера-
циях с файлами прямого доступа. Большинство операций с файлами
последовательного доступа не требуют указания длины записи, одна-
ко Вы можете ускорить файловые операции, установив размер записи
равным 512 байтам. Длина записи может быть в диапазоне от 1 до
32767 байтов и по умолчанию равна 128 байтам.
Форма естественного языка:
Вторая форма оператора OPEN делает совершенно то же самое, что
и первая, но использует полные слова. Вместо того, чтобы писать
"O" или "I", Вы должны писать INPUT или OUTPUT (без кавычек),
например, OPEN "FILENAME" FOR INPUT AS #1. Для файлов с прямым
доступом не указывается этот параметр: OPEN "MYFILE.TXT" AS #2.
Кроме того, Вы можете указать режим APPEND, чтобы записать данные
начиная с конца последовательного файла, не уничтожая уже сущест-
вующих данных: OPEN "B:MYFILE.TXT" FOR APPEND AS #3. Как и для
первой формы в операторе может быть указана необязательная длина
записи. Надо просто добавить в кгнце оператора LEN = число. Нап-
ример OPEN "C:MYFILE.TXT" AS #1 LEN = 52 открывает файл прямого
доступа с записями длиной 52 байта.
Часто программа должна получать имя файла от пользователя
программы. Чтобы использовать это имя файла в операторе OPEN
просто подставьте вместо строки имени файла имя строки, содержа-
щей это имя. При этом необходима проверка на правильность введен-
ного имени.
100 INPUT "Enter file name: ",F$ 'получаем имя файла
110 IF INSTR(F$,".") <> 0 THEN 130 'есть ли расширение?
120 IF LEN(F$) > 8 THEN 500 ELSE 150 'длиннее 8 символов?
130 IF LEN(F$) > 12 THEN 500 'длиннее 12 символов?
140 IF LEN(F$) - INSTR(F$,".") > 3 THEN 500 'тип длиннее 3-х
150 OPEN F$ FOR INPUT AS #1 'открываем файл
.
.
500 INPUT "Improper filename - enter another: ",F$
510 GOTO 110 'если имя неверное, новый запрос
Закрытие файла:
Закрытие файла тривиально. Чтобы закрыть все открытые файлы
напишите CLOSE. Чтобы закрыть определенный файл или несколько
файлов напишите CLOSE #1 или CLOSE #1, #3. Важно закрыть все
файлы перед завершением программы. Если этого не сделать, то в
файле могут остаться данные, которые не записаны на диск. Отме-
тим, что команды END, NEW, RESET, SYSTEM и RUN закрывают все
буфера файлов, но не очищают эти буфера. Уже закрытый файл всегда
может быть снова открыт с использованием любого доступного буфера
файла.
Средний уровень.
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,