Работа с атрибутами файлов проводится при помощи двух процедур:
GetFAttr ( VAR f; VAR Attr : Word );
и
SetFAttr ( VAR f; Attr : Word ).
Они дают более простой доступ к атрибутам файла, чем рассмотренные выше способы анализа файловых типов, и позволяют переустанавливать его без опасения за корректность проводимых {365} действий. Но применение процедур требует одного условия, а именно: обобщенная файловая переменная должна быть предварительно связана с каким-либо физическим файлом на диске, но этот файл должен быть закрыт. Короче говоря, процедуры GetFAttr и SetFAttr могут появляться в программе только в связках (рис. 16.10).
USES DOS;
VAR
f : File Of Real;
t : Text;
FA : Word;
BEGIN
Assign( f, 'DIFFUR.DAT'); GetFAttr( f, FA );
if ( FA and ReadOnly ) = ReadOnly
then SetFAttr( f, FA-ReadOnly );
Rewrite( f );
...
Close( f );
FA := Archive + ReadOnly + Hidden;
Assign( t, 'TEXT.FIL' ); SetFAttr( t, FA );
...
END.
Рис. 16.10
В примере на рис. 16.10 анализируется атрибут файла DIFFUR.DAT, и если он содержит в себе защиту от записи, то она снимается и можно открывать файл. Второй файл TEXT.FIL снабжается целым «букетом» атрибутов защиты.
Используя константы атрибутов, легко анализировать и изменять атрибуты файлов. Пусть FA — считанный только что атрибут файла. Тогда выражение типа
( FA and Hidden ) = Hidden
анализирует наличие атрибута Hidden. Если оно истинно, то атрибут имеется. Выражение типа
FA := FA or ReadOnly
подготовит FA для установки, включив режим «только для чтения»;
FA := FA and (AnyFile - ReadOnly)
сделает все наоборот: исключит ReadOnly из суммы атрибутов, а оператор
FA := FA xor SysFile
сменит атрибут системности на обратный. {366}
Использовать атрибуты нужно аккуратно, ибо установив, например, атрибут ReadOnly файлу f, мы тем самым закроем возможность открывать этот файл для записи (будет ошибка), и надо будет отключать действие этого атрибута.
Естественно, следует помнить и об эффектах иных атрибутов. Так, поставив какому-либо каталогу атрибут Hidden, не следует потом удивляться, куда он делся при подаче команды DIR, как не стоит удивляться тому, что файлы с нарушенным атрибутом архивности не копируются командой BACKUP.