Страница 13 из 41
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 - при других ошибках (нет доступа).
|