检查文件属性枚举

本文关键字:枚举 文件属性 检查 | 更新日期: 2023-09-27 18:16:02

c#新手,我真的不明白下面的代码是如何确定文件是否是只读的。特别是,(属性&== FileAttributes.ReadOnly.

我猜是&是在做某种位与运算吗??我只是不明白这是怎么回事。有人能解释一下吗?

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是位与。这意味着如果在attributes中设置了适当的位,它将返回FileAttributes.ReadOnly的值,否则将返回0。

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

这样做的原因是,一个文件可以设置许多属性。例如:Hidden(值2)、ReadOnly(值1)、System(值4)文件。该文件的属性将是所有这些属性的按位或。文件属性的值应该是1+2+4 = 7。

执行简单的相等性检查,例如

if ( attributes == FileAttributes.ReadOnly )

将返回false,因为7 != 1。但按位与,确实显示只读位已设置。在二进制中,它看起来像:

Attributes: 0111
ReadOnly  : 0001
AND       : 0001

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

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