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

ОГЛАВЛЕНИЕ

     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]. К обычно-
му  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     ;уход на обработку ошибки