Жанр: Учеба
Справочник программиста на IBM PC
... ;BX указывает на начало метки
MOV DI,BX ;помещаем указатель в DI
MOV CX,11 ;пересылка 11 символов
REP MOVSB ;пересылаем строку
Чтобы создать метку можно использовать тот же самый код, но
надо также установить байт атрибутов равный 8 (Вы можете просто
добавить ASCII 8 к строке, содержащей новую метку, так как байт
атрибутов непосредственно следует за самой меткой).
И, наконец, во всех случаях изменения каталога, необходимо
записать каталог обратно на диск. Ошибки при этом непростительны.
;---запись измененных секторов назад на диск
MOV AX,SEG DIR_AREA ;регистры как и при чтении
MOV ES,AX ;
MOV BX,OFFSET DIR_AREA ;
MOV DL,0 ;
MOV DH,0 ;
MOV CH,0 ;
MOV CL,6 ;
MOV AL,7 ;
MOV AH,3 ;номер функции записи секторов
INT 13H ;
Раздел 3. Подготовка к работе с файлами.
Программы, написанные на языках высокого уровня могут просто
открыть файл и вся подготовительная работа для операций с файлами
будет выполнена автоматически. Однако программисты на языке ассемблера
должны создать специальные области данных, которые используются
при операциях ввода/вывода. MS DOS использует два
метода доступа к файлам, метод управляющего блока файла (FCB) и
метод дескриптора файла. Метод FCB сохранился с тех пор, когда MS
DOS не работала с древовидной структурой каталогов, поэтому с его
помощью можно получить доступ только к файлам, находящимся в
текущем каталоге. Метод дескриптора файла позволяет получить
доступ к любому файлу, независимо от того, какой каталог является
текущим.
Поскольку теперь древовидная структура каталогов широко используется,
то метод FCB становится анахронизмом, однако MS DOS
продолжает поддерживать этот метод, чтобы сохранить совместимость
со старым программным обеспечением и по этой причине мы рассмотрим
и его. Однако в своих программах всегда используйте метод
дескриптора файла. Метод дескриптора файла имеет дополнительное
преимущество в том, что он требует меньше подготовительной работы.
Однако в некоторых приложениях сами операции ввода/вывода при
его использовании могут оказаться более сложными, чем в методе
FCB. Например, операции чтения файла с прямым доступом с использованием
метода дескриптора файла требуют чтобы программа вычисляла
смещение каждой записи в файле, в то время как соответствующая
функция FCB получает номер записи и делает необходимые вычисления
сама.
Прежде чем читать или писать данные файл должен быть открыт.
Открыть файл это значит создать и инициализировать специальную
область данных, используемую MS DOS, которая содержит важную
информацию о файле, такую как имя файла, имя накопителя, размер
записи файла и т.д. Языки высокого уровня, такие капк Бейсик,
создают эти области автоматически. Одной из таких областей является
управляющий блок файла и когда используется метод FCB, то
программа создает этот блок, а MS DOS читает и манипулирует его
содержимым. Первоначально FCB содержит только имя файла и имя
накопителя; после того как файл открывается в него добавляется
информация о размере записи файла и о текущей позиции, с которой
к нему будет осуществляться доступ.
С другой стороны, при доступе с помощью дескриптора файла MS
DOS автоматически создает область данных для файла в произвольном
месте. Затем MS DOS создает уникальный 16-битный код номера файла
и впоследствии этот "номер" используется функциями DOS для идентификации
того, с каким из открытых файлов производится операция.
Все что нужно для нахождения файла - это стандартная строка пути,
в которой может быть необязательное имя накопителя и имена подкаталогов
должны быть разделены обратной косой чертой. Эти строки
отличаются от стандартного запроса MS DOS только тем, что они
должны завершаться байтом ASCII 0, с тем чтобы программа могла
найти конец строки (такие строки называются строками ASCIIZ).
Операции по пересылке данных из или в файл требуют, чтобы была
указана область памяти в которую или из которой будут направляться
данные. Такой буфер определяется отведением ему места в памяти
и установкой указателя на его первый байт (т.е. на младший адрес
буфера в памяти). Если передано слишком много данных, то буфер
переполняется и может разрушить данные, расположенные в следующих
адресах памяти. Буфер может использоваться как промежуточный
буфер, работающий только с небольшой порцией данных для операций
чтения или записи. Или буфер может помещаться в область памяти, в
которой программа действительно хранит и обрабатывает данные.
Функции доступа через управляющий блок файла определяют промежуточный
буфер с помощью указателя, которой все время хранится
операционной системой. Этот буфер называется область обмена с
диском (disk transfer area) или DTA. K сожалению, техническая
документация по IBM PC часто называет термином DTA указатель на
буфер, хотя на самом деле правильно называть его указателем на
DTA. После того как указатель на DTA установлен с помощью специальной
функции, все файловые операции используют его до тех пор
пока он не будет изменен. С другой стороны, функции, использующие
дескриптор файла, должны указывать стартовый адрес буфера обмена
каждый раз при вызове функции и они игнорируют указатель на DTA,
используемый функциями управляющего блока файла. Рисунок 5-2
показывает два метода доступа к файлам.
5.3.1 Установка/проверка накопителя по умолчанию.
Программы могут экономить часть работы, назначая накопитель по
умолчанию, на котором содержатся файлы данных. Если в начале
программы запросить у пользователя какой накопитель он будет
использовать, то впоследствии не будет сомнений к какому накопителю
следует обращаться.
Высокий уровень.
В приведенной программе на Бейсике текущий накопитель по умолчанию
переключается с помощью процедуры на машинном языке. Процедура
имеет длину всего 7 байтов. Она помещается в строку X$, а
переменная Z служит указателем на первый байт процедуры. В приложении
Г объясняется как вставлять ассемблерные процедуры в программы
на Бейсике. Номер накопителя устанавливается в строке 110,
причем 0 = A, 1 = B и т.д. Если назначить накопителем по умолчанию
несуществующий накопитель, то ошибки не будет, поэтому будьте
внимательны. Не пытайтесь объединить строки 120 и 130 этой процедуры,
поскольку в этом случае интерпретатор Бейсика будет обрабатывать
их неправильно.
100 DEF SEG 'сегмент на начало области Бейсика
110 NUM = 0 'выбираем накопитель A
120 X$ = CHR$(180)+CHR$(14)+CHR$(178)+CHR$(NUM)+CHR$(205)+
CHR(33)+CHR$(223)
130 Y = VARPTR(X$) 'получаем дескриптор строки (адрес в Y+1)
140 Z = PEEK(Y+1)+PEEK(Y+2)*256 'вычисляем адрес строки
150 CALL Z 'выполняем машинную процедуру
Средний уровень.
Функция EH прерывания 21H устанавливает накопитель по умолчанию.
Надо просто поместить номер накопителя (0 = A, 1 = B и т.д.)
в DL и выполнить прерывание. Эта функция возвращает в AL число
накопителей на машине. Отметим, что когда у машины имеется только
один накопитель, то возвращается число 2. Лучший способ определения
числа накопителей у машины описан в [1.1.5].
MOV AH,0EH ;номер функции
MOV DL,1 ;код для накопителя B
INT 21H ;устанавливаем накопитель по умолчанию
Функция 19H прерывания 21H сообщает какой из накопителей является
накопителем по умолчанию. Для этой функции нет входных
регистров. При возврате в AL содержится кодовый номер, где 0 = A,
1 = B и т.д.
5.3.2 Создание/удаление файла.
Можно создать файл, не помещая в него никакой информации.
Создается элемент каталога, а длина файла устанавливается равной
0. При удалении файла соответствующий элемент каталога на самом
деле не удаляется, он просто становится недействующим за счет
изменения первого байта элемента (первого символа имени файла) на
E5H. Впоследствии этот элемент может быть перезаписан при создании
нового файла. Во время удаления файла вносятся также изменения
в таблицу размещения файлов, с тем чтобы сектора используемые
этим файлом были доступны для других файлов. Само содержимое этих
секторов при этом не стирается. Поэтому можно восстановить удаленный
файл - однако предупреждаем, что операции с таблицей размещения
файлов надо производить очень осторожно.
Высокий уровень.
Бейсик не имеет специальной команды для создания файла. Вместо
этого при открытии файла указанное имя ищется в каталоге и, если
оно не найдено, то создается новый файл. Если открыть новый файл,
а затем закрыть его не производя в него записи, то он останется
в каталоге с длиной 1 байт и ему будет отведен кластер дискового
пространства (единственный байт - это символ Ctrl-Z - ASCII 26 -
который используется в качестве признака конца стандартного текстового
файла). Детали оператора OPEN см. в [5.3.3].
Наоборот, оператор CLOSE не уничтожает файл. Вместо этого для
уничтожения файла используется оператор KILL. Для того чтобы
уничтожить файл его не надо открывать. Просто поместите имя файла
в кавычках, например KILL "A:ACCOUNT.DAT". Или, если файл находится
в другом подкаталоге, то надо использовать стандартный путь
к файлу, например KILL "A:\FINANCES\ACCOUNT.DAT". В обоих случаях
имя накопителя необходимо указывать только если файл находится не
на накопителе по умолчанию. Отметим, что Вы не можете воспользоваться
этим методом, чтобы удалить подкаталог (который является
одним из видов файла) - вместо этого используйте RMDIR.
Средний уровень.
Файл может быть создан или уничтожен с помощью либо метода
управляющего блока файла, либо метода дескриптора файла. Создание
файла одним из методов ни в коей мере не ограничивает будущий
доступ к нему только этим методом. Но, поскольку одновременно с
созданием он открывается, то при создании необходимо использовать
тот метод, с помощью которого Вы будете работать с этим файлом на
этот раз. Когда файл создается, а затем закрывается и при этом в
него ничего не записывается, то ему соответствует элемент каталога
с нулем в поле длины файла, однако дисковое пространство этому
файлу не отводится. Важно понимать, что когда последовательный
файл открывается для записи (а не для добавления) данных, то
используется именно эта функция создания файла, поэтому файл
обрезается до нулевой длины и затем полностью перезаписывается.
Метод FCB:
Функция 16H прерывания 21H создает и открывает файл. Создайте
FCB с именем файла и накопителя и пусть DS:DX указывает на него.
Затем вызовите функцию. Просматривается каталог и если найден
совпадающий элемент, то снова используется именно этот элемент
каталога, при этом новый файл перекрывает старый с тем же именем.
Чтобы избежать непреднамеренного разрушения файлов, сначала проверьте
на наличие файла с таким именем, используя функцию 11H
прерывания 21H [5.2.1]. Если нет файла с таким именем, то создается
новый элемент каталога и в AL возвращается 0; если каталог
полон, то в AL возвращается FF. Чтобы присвоить файлу специальные
атрибуты (например, статус только для чтения) [5.2.6] используйте
расширенный управляющий блок файла [5.3.5]. При открытии новый
файл инициализируется с нулевой длиной и ему отводится кластер
дискового пространства. Вот пример:
;---в сегменте данных
FCB DB 1,'MYFILE DAT',25 DUP(0)
;---проверка наличия такого файла
MOV AH,11H ;функция поиска файла
LEA DX,FCB ;DS:DX указывают на FCB
INT 21H ;ищем файл
CMP AL,0 ;AL = 0 если файл существует
JE WARN_USER ;если да, то сообщаем об этом
;---создание файла
MOV AH,16H ;номер функции создания файла
INT 21H ;создаем файл
Для создания файла со специальными атрибутами, например статусом
только для чтения, надо использовать расширенный управляющий
блок файла. Байт атрибутов файла обсуждается в [5.2.6]. K обычному
FCB надо добавить 7-байтный заголовок, начиная с байта FFH,
затем должны следовать 5 байтов ASCII 0, а затем нужный байт
атрибутов. Для создания спрятанного файла необходимо, чтобы был
установлен бит 1 байта атрибутов. Чтобы спрятать файл, открытый в
приведенном примере, напишите:
FCB DB 0FFH,5 DUP(0),2,1,'MYFILE DAT',25 DUP(0)
Функция 13H прерывания 21H уничтожает файл. Надо чтобы DS:DX
указывали на неоткрытый FCB и выполнить функцию. Если не найдено
файла с указанным именем, то в AL возвращается FF, иначе 0. В
имени файла могут использоваться джокеры (знаки вопроса, но не
звездочки) и в этом случае за одно обращение к функции может быть
удалено несколько файлов. Вот пример:
;---в сегменте данных
FCB DB 1,'MYFILE DAT',25 DUP(0)
;---удаляем файл
MOV AH,13H ;номер функции удаления файла
LEA DX,FCB ;DS:DX указывают на FCB
INT 21H ;удаляем файл
CMP AL,0FFH ;проверка на ошибку
JE DELETE_ERROR ;уход на обработку ошибки
Метод дескриптора файла:
Функция 3CH прерывания 21H создает и открывает новый файл
методом дескриптора файла. DS:DX должны указывать на строку,
дающую путь к файлу и имя файла в стандартном формате MS DOS,
включая имя накопителя, если файл находится не на накопителе по
умолчанию. Строка должна завершаться байтом 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:\LEVEL1\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
...Поділитися у соцмережах