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");
}
}
}
}
最佳答案
语句attributes & FileAttributes.ReadOnly
是bitwise AND。这意味着,如果在FileAttributes.ReadOnly
中设置了适当的位,它将返回attributes
的值,否则将返回0。
按位与运算采用相等长度的两个二进制表示形式,并对每对对应位执行逻辑与运算。如果第一位为1,第二位为1,则每个位置的结果为1;否则,为0。否则,结果为0。
这样做的原因是因为文件可以设置许多attributes。例如,它可以是Hidden
(值2),ReadOnly
(值1),System
(值4)文件。该文件的属性将是所有这些属性的按位或。文件属性的值将为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");
关于c# - 检查FileAttributes枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16822760/