2011-09-17 3 views
0

현재 사용자가 음악 파일을 저장할 디렉토리와 하위 디렉토리를 검색하여 컬렉션에 추가하는 프로그램이 있습니다. 그러나 그것이 오는 가로 건너 오는 디렉토리 중 하나가 보호되면 프로그램이 넘어집니다. 이 문제를 피하기 위해 검색하기 전에 사용자가 디렉토리에 액세스 할 수 있는지 확인하는 방법을 알고 싶었습니다. 다음은 검색에 사용하는 코드입니다. 현재 "시스템 볼륨 정보"에 대한 기본적인 해결 방법이 있지만 다른 보호 된 디렉터리가있을 수 있으므로이 정보를 포함하도록 변경하려고했습니다.주어진 디렉토리에 대한 액세스 권한을 어떻게 확인할 수 있습니까?

public void SearchForMusic() 
    { 
     //Searches selected directory and its sub directories for music files and adds their path to ObservableCollection<string> MusicFound 
     foreach (string ext in extentions) 
     { 
      foreach (string song in Directory.GetFiles(SearchDirectory, ext)) 
      { 
       musicFound.Add(song);     
      } 

      foreach (string directory in Directory.GetDirectories(SearchDirectory)) 
      { 
       if (directory.Contains("System Volume Information")) 
       { 

       } 
       else 
       { 
        foreach (string song in Directory.GetFiles(directory, ext)) 
        { 
        musicFound.Add(song); 
        } 

        foreach (string subDirectory in Directory.GetDirectories(directory)) 
        { 
         foreach (string subSong in Directory.GetFiles(subDirectory, ext)) 
         { 
          musicFound.Add(subSong); 
         } 
        } 
       } 
      } 
     } 
    } 

많은 감사합니다 :) 당신이 파일 시스템 개체에 액세스 할 수 있는지 확인하는 가장 쉬운 방법으로

답변

2

은 액세스를 시도하는 것입니다. 액세스가 거부 된 오류로 실패하면 액세스 권한이 없습니다. 오류 상태를 감지하고 검색의 다음 항목으로 진행하면됩니다.

다시 말해, 시스템에 대한 액세스를 확인하는 대리인은 결국 액세스 권한의 궁극적 인 조정자입니다.

+0

+1; @ 조나단 : 예외 처리 ('try' /'catch')는 예외적 인 경우를 위해 예약되어야합니다. 사용중인 API가 당신에게 다른 옵션을주지 않는다면 말입니다. 가능한 모든 경우에 상태 검사 또는 '시도'변형을 사용하십시오. 그래도 여기서 편리하게 볼 수는 없지만 ('GetAccessControl'?). 따라서 예외 핸들러가 붙어있을 수 있습니다. 그러나'UnauthorizedAccessException' (또는 던져진 특정 예외가 무엇이든)을 잡아서 기본 'Exception' 클래스가 아닌지 확인하십시오. –

+1

@Merlyn'try/catch'에 대한 당신의 요지는 유효하지만 결코 행동의 정확성을 무시해서는 안됩니다. 'try/catch'를 피하고 자신의 권한 검사 코드를 구현하면 정상적인 동작에 예외를 사용하지 않는 것에 만족할 수 있지만 프로그램이 제대로 작동하지 않을 때 위안이되지 않습니다. 또한, 내 대답은 오류보다는 오히려 예외를 감지했다. 좋은 파일 처리 API는 TryXXX 변형을 제공해야합니다. –

+0

전적으로 동의합니다. 내 포인트는 기존의 체크 메소드가있을 때, 그리고 관심있는 케이스를 포착 할 수있을 때이다. 자신감을주는 코드를 얻을 수 없다면, 예외 핸들러와 주석 왜 예외를 삼키는거야? –

1

this 질문은 쓰기 권한 읽기로 바꿀 수 있습니다. 또한 try catch 블록에 코드를 래핑하고 예외가 throw되면 디렉토리를 통과 할 수 없다고 가정하거나 예외 유형을 제대로 검사 할 수 있습니다.

+0

+1; 좋은 참조. 그것은 그들이 추천하는 메소드가'Obsolete' ('SecurityManager.IsGranted')로 표시되어 있기 때문에 어렵습니다. 또한 예외 처리에 대한 David의 답변 아래의 주석을 참조하십시오. –

+0

True - 저는 파이썬의 강력한 배경을 가지고 있으며, '허가 대신에 용서를 구하십시오'생각합니다 :) 그래서 오류를 잡는 것은 대개는 부분이됩니다 - 물론 TrySomething 메서드가있는 경우 .NET에서 항상 더 뛰어납니다. 예외를 catch하는 것은 권장 방법/모범 사례가 아닙니다. – leon

관련 문제