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.ReadOnlybitwise 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/

10-12 15:05