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");
}
}
}
}
答案 0 :(得分:4)
声明attributes & FileAttributes.ReadOnly
是bitwise 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");