foreach (FileAttributes attribute in myFile.Attributes)
{...}

Можно также вызвать метод ToString() свойства Attributes. Он вернет строку, состоящую из списка атрибутов, разделенных запятыми:

// Это отобразит строку в формате "ReadOnly, Archive, Encrypted"
lblInfo.Text = myFile.Attributes.ToString();

Для проверки одного конкретного атрибута необходимо использовать битовую арифметику. Например, рассмотрим следующий, неправильный код:

if (myFile.Attributes == FileAttributes.ReadOnly)
{ ... }

Это сравнение будет истинным только в том случае, если атрибут "только для чтения" окажется единственным из атрибутов текущего файла. Это редкий случай. Если вы хотите успешно проверить, является ли файл доступным только для чтения, то должны вместо этого использовать такой код:

if ((myFile.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{ ... }

Эта проверка будет успешной, потому что фильтрует только один атрибут из всего набора атрибутов файла. По сути, установка Attribute состоит (в двоичном виде) из серий единиц и нулей — такой как 00010011. Каждая единица представляет имеющийся атрибут, а каждый ноль — отсутствующий. Когда вы используете операцию & с перечислимым значением, она автоматически выполняет операцию битового "И", которая сравнивает каждый двоичный разряд в значении перечисления. Например, если вы комбинируете значение 00100001 (представляющее атрибуты "архивный" и "только для чтения" отдельного файла) с перечислимым
значением 00000001 (представляющим флаг "только для чтения"), то результат будет равен 00000001. Он будет иметь 1 только в том разряде, где это совпадает в обоих значениях. Вы можете затем проверить результирующее значение на предмет равенства перечислимому значению FileAttributes.ReadOnly, используя
операцию равенства (==).

Подобная логика позволяет определить, что файл не имеет определенного атрибута:

if ((myFile.Attributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly)
{ ... }

При установке атрибута вы также должны использовать битовую арифметику. В данном случае она необходима для того, чтобы гарантировать, что не будут нечаянно задеты другие, ранее установленные атрибуты.

// Это добавит только один атрибут "только для чтения".
myFile.Attributes = myFile.Attributes | FileAttributes.ReadOnly;

// Это удалит атрибут "только для чтения".
myFile.Attributes = myFile.Attributes & ~FileAttributes.ReadOnly;

предыдущая    следующая страница    вначало главы    оглавление

580

Hosted by uCoz