2013-05-29 180 views
1

C#的新手和我真的不知道下面的代碼是如何確定文件是否是隻讀的。特別是,(屬性&FileAttributes.ReadOnly)如何評估某些不存在或不存在== FileAttributes.ReadOnly。檢查FileAttributes枚舉

我猜&正在做某種按位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"); 
      } 
     } 
    } 
} 

回答

3

聲明attributes & FileAttributes.ReadOnlybitwise AND。這意味着,它會返回的FileAttributes.ReadOnly的值,如果相應位中設定attributes,否則將返回0。

的逐位AND需要兩個相等長度的二進制表示,並對每一對邏輯與運算的相應位。如果第一位是1並且第二位是1,則每個位置的結果是1;否則,結果爲0.

原因是因爲一個文件可能有很多attributes集。例如,它可以是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"); 
+0

不要忘了[HasFlag(http://msdn.microsoft.com/en-us/library/system.enum.hasflag。 aspx)方法。我確定它在內部也做同樣的事情,但我認爲它比按位操作更清晰。 – cadrell0

+0

@ cadrell0感謝提醒,回覆更新:) – Steve