Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители
Страница 41. Определение дисковых ошибок и восстановление после них


     5.4.8 Определение дисковых ошибок и восстановление после них.


   Дисковые операции настолько  сложны, что имеется большое коли-
чество возможных ошибок.  Большинство дисковых ошибок обсуждаются
вместе с операциями, при которых они  могут происходить. В данном
разделе они собраны вместе, чтобы помочь Вам при разработке  про-
цедуры общего назначения для  восстановления  после дисковых оши-
бок.
   Дисковые  ошибки бывают двух типов, которые мы будем  называть
мягкими (soft) и жесткими  (hard).  Мягкие ошибки возникают из-за
неправильного  запроса на доступ к файлу: запрошенный файл  может
отсутствовать или дисковое  пространство  может кончиться прежде,
чем  будет  записан весь файл.  С другой стороны, жесткие  ошибки
возникают при неверных последовательностях  или временных несоот-
ветствий  при дисковых операциях, которые могут  быть  следствием
неверного выравнивания или проблем с накопителем.  В этом случае,
лучше всего произвести сброс диска перед обработкой.

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


   В  [7.2.5] объяснено как подготовить процедуру обработки  оши-
бок.  Оператор ON ERROR  GOSUB  заставляет  программу  перейти на
процедуру обработки ошибки при возникновении критической  ошибки.
Процедура прежде всего определяет кодовый номер ошибки в Бейсике,
который для дисковых ошибок может быть одним из следующих:

   52      Bad file number.  (Неверный номер файла.) Файл не отк-
           рыт под тем номером, к  которому  идет  обращение (#1,
           #2 и т.д.)
   53      File  not  found.  (Файл не найден.) Используется  при
           выполнении операторов LOAD, KILL, NAME, FILES и OPEN.
   54      Bad file mode.  (Неверный режим доступа.) Попытка дос-
           тупа  к файлу другим образом, по сравнению с тем,  для
           чего он был открыт,  например, попытка записи в после-
           довательный файл, открытый для чтения.
   55      File already open.  (Файл уже открыт.) Попытка открыть
           файл, который уже открыт, или  уничтожить (KILL) файл,
           который еще не закрыт.
   58      File  already exists.  (Файл уже существует.)  Попытка
           переименовать файл  (с  помощью  NAME) на имя, которое
           уже есть в каталоге.
   61      Disk full.  (Диск полон.) См. специальное обсуждение в
           [5.1.4], относящееся к этой ошибке.
   62      Input past end.   (Чтение  за  концом  файла.) Попытка
           прочитать  из последовательного файла больше  перемен-
           ных, чем он содержит.   Чтобы избежать этой ошибки ис-
           пользуйте функцию EOF, как объяснено в [5.4.4].
   63      Bad  record number.  (Неверный номер записи.)  Попытка
           прочитать или записать  запись  с номером большим, чем
           число записей в файле.
   64      Bad  file  name.  (Неверное имя  файла.)  Используется
           операторами KILL, NAME и FILES.
   67      Too many files.   (Слишком  много  файлов.) В каталоге
           больше нет места для записи информации о файлах.  Дру-
           гой возможный вариант состоит  в том, что открытие еще
           одного  файла  приведет к тому,  что  будет  превышено
           максимально  допустимое  число  одновременно  открытых
           файлов.

   70      Disk is write-protected. (Диск защищен от записи.)
   71      Disk is not ready. (Диск не готов.) Наиболее вероятно,
           не закрыт дисковод с дискетой.
   72      Disk media error. (Диск  поврежден.)  Как правило, это
           сообщение  выдается  при повреждении  дискеты,  однако
           иногда оно появляется при сбоях оборудования.
   74      Specified wrong disk  in   RENAME  operation.  (Указан
           неверный диск в операции RENAME.)
   75      Path/file  access  error.  (Ошибка  доступа к  файлу.)
           Попытка открыть подкаталог  или  метку тома, как файл.
           Или  попытка писать в файл, который защищен от записи.
           Эта ошибка чаще  всего  выдается  при  попытке удалить

           текущий каталог.  Появляется при операциях OPEN, NAME,
           MKDIR, CHDIR и RMDIR.
   76      Path not found.  (Путь не найден.) Неправильно  указан
           путь или его не существует.   Появляется при операциях
           OPEN, MKDIR, CHDIR и RMDIR.

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

100 ON ERROR GOSUB 5000         '
 .
 .
600 '''
 .
 .
5000 '''
5010 IF ERR = 61 PRINT "Disk full": GOTO 5100
5020 IF ERR = 70 PRINT "Disk is write protected": GOTO 5100
 .
 .
5100 PRINT "Correct the problem, then strike any key"
5110 C$ = INKEY$: IF C$ = "" THEN 5110
5120 RESUME 600

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


   Функция 1 прерывания 13H  возвращает  в AL байт, дающий статус
дискового накопителя. Значение его битов следующее:
   биты 0-1   01 = неверная команда, или, если бит 3 = 1, то
                   попытка обмена данными за границей 64K
              10 = адресная метка не найдена
              11 = попытка записи на защищенный от записи диск
          2   1  = указанный сектор не найден
          3   1  = переполнение DMA (потеря данных при обмене),
                   или, если бит 0 = 1, то попытка обмена дан-
                   ными за границей 64K
          4   1  = данные прочитаны неверно, надо повторить
          5   1  = ошибка контроллера
          6   1  = ошибка операции поиска
          7   1  = нет ответа от накопителя (тайм-аут)

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

устанавливается флаг  переноса.  Если  произошла ошибка, то номер
кода этой ошибки возвращается в AX.  Вот коды, относящиеся к дис-
ковым операциям:

   1      Неверный номер функции
   2      Файл не найден
   3      Путь не найден
   4      Уже открыто максимально допустимое число файлов
   5      Отрицание доступа (ошибка оборудования)
   6      Неверный номер файла
  15      Указан неверный накопитель
  16      Попытка удалить текущий каталог
  17      Не то же устройство
  18      Больше нет файлов (при поиске  в каталоге с использова-
          нием джокеров)

   Восстановление после этих "мягких" ошибок несложно.  Некоторые
предупреждают Вас о программных ошибках.   Другие возникают из-за
ошибочных действий пользователя.  Если же не отвечает сам накопи-
тель, то произошла критическая ошибка. В разделе [7.2.5] показано
как написать процедуру обработки критических ошибок.
   В MS DOS 3.0 введены расширенные коды ошибок.  Они могут  быть
получены с помощью функции 59H прерывания 21H, когда флаг перено-
са индицирует возникновение ошибки.  Обсуждение этого вопроса см.
в [7.2.5].

 
« Предыдущая статья   Следующая статья »