2

C# 新手,我真的不明白下面的代码如何确定文件是否为只读文件。特别是, (attributes & FileAttributes.ReadOnly) 如何评估是否有 == 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");
            }
        }
    }
}
4

1 回答 1

4

该语句attributes & FileAttributes.ReadOnly按位 AND。这意味着FileAttributes.ReadOnly如果在 中设置了适当的位,它将返回 的值attributes,否则将返回 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方法为您解决这个问题。对 readonly 标志的检查变得更加简单,看起来像

if ( attributes.HasFlag( FileAttributes.ReadOnly ) )
{
    Console.WriteLine("read-only file");
于 2013-05-29T20:00:21.070 回答