Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




га необходимо, чтобы он не содержал файлов или ссылок на другие подкаталоги. Кроме того, Вы не можете уда- лить подкаталог, который является Вашим текущим каталогом (тот, с которым по умолчанию выполняются все операции над каталогами). Отметим также, что невозможно удалить корневой каталог.

      Высокий уровень.

      Бейсик предоставляет команды MKDIR (создай каталог) и RMDIR (удали каталог). За обеими должны следовать стандартные пути указания каталога, содержащие до 63 символов, включая имя накопи- теля. Путь должен быть заключен в кавычки. Чтобы добавить подка- талог с именем STORKS в подкаталог BIRDS напишите MKDIR "B:MAM- MALS\BIRDS\STORKS". После выполнения этой команды будет создан файл STORKS, используемый как подкаталог и факт его существования будет отражен в создании элемента с именем STORKS в подкаталоге с именем BIRDS. Для удаления этого подкаталога надо сначала удалить из него все файлы [5.3.2]. Затем надо использовать команду RMDIR "B:MAMMALS\BIRDS\STORKS".
      В этих примерах предполагалось, что Вашим текущим каталогом являлся корневой каталог. Однако, если Ваш текущий каталог нахо- дится где-то на пути к подкаталогу, над которым осуществляются операции, то нет необходимости указывать весь путь. Поэтому, если Вашим текущим каталогом является BIRDS, то для создания или уда- ления подкаталога STORKS можно использовать команды MKDIR "\STORKS" или RMDIR "\STORKS".

      Средний уровень.

      Поскольку управляющие блоки файлов обслуживают только корневой каталог, то для создания или удаления подкаталога надо использо- вать дескрипторы файлов.

Создание подкаталога:
      DS:DX должны указывать на строку, дающую накопитель и путь к каталогу, в котором должен быть создан подкаталог. Строка должна завершаться байтом ASCII 0. Для открытия подкаталога с именем PRIMATES в корневом каталоге накопителя A: надо записать строку в виде "A:\PRIMATES". Для открытия подкаталога в другом подкаталоге с именем MAMMALS напишите "A:\MAMMALS\PRIMATES". Имя накопителя A: может быть опущено если Вы работаете с накопителем, используе- мым по умолчанию, и путь может начинаться с текущего каталога. Поместите в AH 39H и выполните прерывание 21H; если указан пра- вильный путь, то будет создан новый каталог. В противном случае будет установлен флаг переноса, а AX будет содержать код ошибки 3 (путь неверен) или 5 (нет доступа). В примере создается подката- лог PRIMATES:
;---в сегменте данных PATH DB 'A:MAMMALS\PRIMATES',0
;---создаем подкаталог с именем PRIMATES
      LEA DX,PATH ;DS:DX должны указывать на путь
      MOV AH,39H ;номер функции
      INT 21H ;создаем подкаталог
      JC ERROR_ROUT ;обработка ошибок
Удаление подкаталога:
      Для удаления подкаталога надо сформировать строку, в точностью совпадающую с той, которую Вы указывали при создании каталога. Затем поместите в AH 3AH и выполните прерывание 21H. Опять при невыполнении функции в AX будут возвращены коды 3 или 5 (код 5 может указывать, что каталог непустой).

5.2.3 Чтение/изменение подкаталога.



      Подкаталоги во многом подобны корневому каталогу, за исключе- нием того, что они хранятся как обычные файлы, а не в заранее предопределенных секторах. Подкаталоги невозможно спутать с обыч- ными файлами, поскольку объект каталога, относящийся к подкатало- гу, имеет специальный байт атрибутов (с установленным битом 5 - см. [5.2.6]). Подкаталоги начинаются с двух специальных 32-байт- ных объектов, первый из которых имеет имя точка, а второй - две точки. Они ориентируют подкаталог среди окружающих каталогов. Ссылки на подкаталоги нижнего уровня записываются как обычные ссылки на файлы.
      Предполагается, что подкаталог может быть прочитан как любой другой файл, поэтому вроде бы не составляет труда загрузить его в память. Но, к сожалению, создатели MS DOS поместили 0 в поле длины файла для элементов, относящихся к подкаталогам. В резуль- тате DOS считает, что этот файл имеет нулевую длину и отказывает- ся читать его. Нет простого способа преодолеть эту проблему.

      Высокий уровень.

      В Бейсике команда FILES может использовать стандартные имена путей для вывода подкаталога; например, FILES "B:MAMMALS\BIRDS"

выводит все файлы, содержащиеся в подкаталоге BIRDS. Эта команда может быть использована и для получения информации о наличии в каталоге определенного файла. Например, FILES "LEVEL1\NEWDATA" ищет файл NEWDATA и выводит его имя, если он найден. Хотя это может быть полезным для пользователя, но часто самой программе необходимо знать существует или нет указанный файл. Чтобы устано- вить это попытайтесь открыть файл для последовательного чтения. Если он не будет найден, то возникнет ошибочное условие 63. Соз- дайте процедуру обработки ошибок, как описано в [5.4.8]. Затем используйте переменную, чтобы отметить был ли найден требуемый файл (в нашем примере переменная "EXISTS"). Если программе не нужно, что этот файл был открыт, то закройте его перед тем как двинуться дальше.
100 ON ERROR GOTO 1000 'процедура обработки ошибок 110 EXISTS = 1 'начальное значение "флага" 120 INPUT "Enter filename: ",S$ 'запрос имени файла 130 OPEN S$ FOR INPUT AS #3 'открываем его для послед. чтения 140 IF EXISTS = 0 THEN BEEP: PRINT "File does not exist"
      .
      . 1000 IF ERR = 53 THEN 1500 'файл не существует? 1010 IF ERR = 64 THEN ... 'другие ошибки
      . 1500 EXISTS = 0 'меняем значение флага 1510 RESUME 140 'продолжаем выполнение программы

      Средний уровень.

      Функции работы через дескрипторы файлов, которые использова- лись для доступа к корневому каталогу [5.2.1] могут так же просто обращаться к любому подкаталогу. Чтобы вывести все содержимое каталога надо просто использовать функцию 4EH для поиска файлов *.*, а затем повторять поиск, используя функцию 4FH. Когда больше не будет файлов, то будет установлен флаг переноса, а AL будет
содержать 18. Каждый раз, когда будет обнаружен очередной эле- мент, в DTA будет записана информация о файле, включая полный его путь (отмечаем использование DTA в функциях, использующих деск- риптор файла).