2013-05-29 2 views
1

C#을 처음 사용하는 이유는 파일이 읽기 전용인지 아닌지를 아래 코드가 어떻게 판별하는지 이해할 수 없습니다. 특히, (& FileAttributes.ReadOnly 속성은) FileAttributes.ReadOnly를 평가하거나 평가하지 않는 무언가를 어떻게 평가합니까?FileAttributes 열거 형 검사

나는 &이 bitwise 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이다. 이것은 비트를 해당 비트 attributes 설정되어있는 경우는, FileAttributes.ReadOnly의 값을 반환 그렇지 않으면 0

반환한다는 의미와 동일한 길이의 두 개의 이진 표현을 취하여 각각의 쌍의 논리 AND 연산을 수행 해당 비트의 첫 번째 비트가 1이고 두 번째 비트가 1이면 각 위치의 결과는 1입니다. 그렇지 않은 경우 결과는 0입니다.

파일에 많은 attributes이있을 수 있기 때문입니다. 예를 들어, Hidden (값 2), ReadOnly (값 1), System (값 4) 파일 일 수 있습니다. 해당 파일의 속성은 모든 속성의 비트 OR입니다. 파일의 속성 값은 1 + 2 + 4 = 7이됩니다.

간단한 동일성 검사를 수행합니다.

if (attributes == FileAttributes.ReadOnly) 

7 != 1이므로 false를 반환합니다. 그러나 비트 AND는 읽기 전용 비트가 설정되었음을 보여줍니다.

Attributes: 0111 
ReadOnly : 0001 
AND  : 0001 
@ cadrell0에 의해 지적 된 바와 같이

에서, enum 유형이 HasFlag 방법을 사용하여 당신이 돌볼 수 : 바이너리에서이처럼 보인다. 읽기 전용 플래그에 대한 검사가 훨씬 더 간단하게, 그리고 [HasFlag] 잊지 마세요

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

처럼 보인다 (http://msdn.microsoft.com/en-us/library/system.enum.hasflag. aspx) 방법. 나는 내부적으로 같은 일을 할 것이라고 확신하지만 비트 연산보다 더 명확하다고 생각한다. – cadrell0

+0

@ cadrell0 알림을 보내 주셔서 감사합니다. 답변이 업데이트되었습니다 :) – Steve

관련 문제