Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Открытие/закрытие файла. Часть 2

ОГЛАВЛЕНИЕ

Форма естественного языка:

   Вторая форма оператора 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   ;на обработку ошибки