检查FileAttributes枚举

时间:2013-05-29 19:58:13

标签: c#

C#的新手,我真的不明白下面的代码是如何确定文件是否为只读的。特别是,(attributes& FileAttributes.ReadOnly)如何评估是否为== FileAttributes.ReadOnly。

我在猜测&正在做某种按位AND ??我只是不遵循这是如何工作的。任何人都可以提供解释吗?

using System;
using System.IO;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileAttributes attributes = File.GetAttributes("c:/Temp/testfile.txt");
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                Console.WriteLine("read-only file");
            }
            else
            {
                Console.WriteLine("not read-only file");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

声明attributes & FileAttributes.ReadOnlybitwise AND。这意味着如果在FileAttributes.ReadOnly中设置了相应的位,它将返回attributes的值,否则它将返回0.

  

按位AND采用两个相等长度的二进制表示,并对每对相应位执行逻辑AND运算。如果第一位为1且第二位为1,则每个位置的结果为1;否则,结果为0。

原因是因为文件可以设置很多attributes。例如,它可以是Hidden(值2),ReadOnly(值1),System(值4)文件。该文件的属性将是所有这些属性的按位OR。文件属性的值为1 + 2 + 4 = 7.

执行简单的等式检查,例如

if ( attributes == FileAttributes.ReadOnly )

会返回false,因为7 != 1。但是按位AND,确实显示只读位被设置。在二进制文件中,这看起来像:

Attributes: 0111
ReadOnly  : 0001
AND       : 0001

正如@ cadrell0所指出的,enum类型可以使用HasFlag方法为您处理此问题。对只读标志的检查变得更加简单,看起来像

if ( attributes.HasFlag( FileAttributes.ReadOnly ) )
{
    Console.WriteLine("read-only file");