Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители
Страница 13. Спрятанные и защищенные от записи файлы


     5.2.6 Спрятанные и защищенные от записи файлы.


   DOS  использует шесть различных атрибутов файлов, которые дают
данному файлу определенный статус.  Файл может иметь несколько из
этих атрибутов одновременно (но не все). Атрибуты устанавливаются
12-м байтом 32-байтного  элемента  каталога.  Младшие шесть битов
имеют значение, а остальные должны быть равны нулю. Биты такие:

   если бит 5 = 1,   то файл был изменен со времени последней
                     архивации
            4 = 1,   то файл является подкаталогом
            3 = 1,   то этот элемент является не файлом, а меткой
                     тома
            2 = 1,   то файл является "системным"
            1 = 1,   то файл спрятан при поиске по каталогу
            0 = 1,   то файл объявлен только для чтения

Бит 5 это архивный бит, используемый программами BACKUP и RESTORE
DOS. Этот бит сьрасывается в 0 после архивации и устанавливается,
когда с файлом снова работали. При следующей архивации неизменен-
ные файлы могут быть обнаружены и проигнорированы.

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


   Бейсик не позволяет Вам  устанавливать  атрибуты  файла прямо.
Справьтесь в [5.2.1], как считать каталог в память, найти  нужный
файл, сделать изменения и снова записать его на диск.  Как только
каталог помещается в память, байты  атрибутов находятся по смеще-
ниям 11, 43, 75 и т.д. Если нужно, то Вы можете прочитать текущие
атрибуты и изменить только один  бит,  используя  технику битовых
операций,  описанную в приложении Б.  Но легче просто  переписать
все атрибуты заново.  Будьте  внимательны,  ошибки могут быть фа-
тальными.   В данном примере считываются атрибуты файла с  именем
"NEWDATA.AAA".

100 'читаем сектора каталога, начиная с &H2000 и затем ...
110 DEF SEG = &H2000         'указываем на область каталога
120 FILENAME$ = "NEWDATAAAA" 'ищем имя файла без точки
130 DIRPTR = 0               'указатель в каталоге
140 FOR N = 1 TO 112         'проверяем все элементы
150 X$ = ""                  'временная строка для имени файла
160 FOR M = 0 TO 10          'для каждого символа имени
170 X$ = X$+PEEK(DIRPTR+M)   'добавляем его к строке
180 NEXT                     '
190 IF X$ = FILENAME$ THEN 220  'если имя найдено, то уходим
200 NEXT                     '
210 PRINT "File not found": END  'нет такого файла
220 X = PEEK(DIRPTR+11)      'получаем атрибуты нужного файла
230 IF X AND 32 <> 0 THEN PRINT "File not baked up"
240 IF X AND 16 <> 0 THEN PRINT "File is a subdirectory"
250 IF X AND 8 <> 0 THEN PRINT "Volume label - not a file"
260 IF X AND 4 <> 0 THEN PRINT "File is a system file"
270 IF X AND 2 <> 0 THEN PRINT "File is a hidden file"
280 IF X AND 1 <> 0 THEN PRINT "File is read-only"

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


   Функция 43H прерывания 21H может  как находить, так и изменять
атрибуты  файла, но только если файл был открыт с помощью  метода
дескриптора файлов, а не  с  помощью  метода  управляющего  блока

файла. Нет аналогичной функции для FCB. Байт атрибутов может быть
установлен при создании  файла   [5.3.2],  используя  расширенный
управляющий блок файла.  Но если Вы последовательно откроете FCB,
измените установку атрибутов  и  затем  закроете  файл, то у него
останутся первоначальные атрибуты. Хотя, конечно, Вы можете изме-
нить атрибуты каким-нибудь  обходным  путем, но намного проще ис-
пользовать функцию, использующую метод дескриптора файлов.
   Чтобы использовать функцию 43H, поместите 1 в AL, чтобы  прис-
воить файлу байт  атрибутов,  содержащийся  в CX (на самом деле в
CL, поскольку CH равен 0). Можно наоборот поместить в AL 0, чтобы
в CX был возвращен текущий байт атрибутов файла.  В обоих случаях
DS:DX  должны  указывать на строку, дающую путь к  файлу.   Конец
строки отмечается байтом ASCII 0  (который не входит в число 63-х
символов).  В примере статус "hidden" (спрятанный)  присваивается
файлу OVERDUE:

;---в сегменте данных
PATH   DB   'A:ACCOUNTS',0

;---включаем признак спрятанного файла
   MOV  AH,43H          ;номер функции
   MOV  AL,0            ;читаем байт атрибутов
   LEA  DX,PATH         ;DS:DX указывают на путь
   INT  21H             ;байт атрибутов в CX
   JC   ERROR_ROUTINE   ;обработка ошибок
   OR   CL,10B          ;включаем бит 1
   MOV  AH,43H          ;номер функции
   MOV  AL,1            ;заменяем байт атрибутов
   INT  21H             ;теперь файл стал спрятанным

Флаг переноса устанавливается  при  возникновении ошибки.  В этом
случае  в  AX возвращается 2 - если файл не найден, 3 -  если  не
найден путь и 5 - при других ошибках (нет доступа).

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