Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Спрятанные и защищенные от записи файлы
ОГЛАВЛЕНИЕ
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 - при других ошибках (нет доступа).