2012-09-11 2 views
3

아래의 LINQ 쿼리를 사용하여 디렉터리 목록을 가져옵니다. 오류가 발생했습니다 (System.UnauthorizedAccessException 사용자 코드에 의해 처리되지 않았습니다). 내가 액세스 할 수있는 디렉토리 만로드하는 방법.C# LINQ의 System.UnauthorizedAccessException 처리

var files = from f in System.IO.Directory.GetDirectories(@"\\testnetwork\abc$", 
            "*.*", 
            SearchOption.AllDirectories) 
      select System.IO.Path.GetDirectoryName(f); 

오류 : 경로 '\ testnetwork \ ABC $ \ DemoFolder의 \'를 거부하는

액세스 할 수 있습니다.

+0

지난 해에 오류가 발생했기 때문에 Wasp에서 언급 한대로 답변을 업데이트했습니다. –

답변

1

catch를 사용하여 UnauthorizedAccessException을 잡으십시오. .

string[] directories = Directory.EnumerateDirectories(@"\\testnetwork\abc$","*.*", SearchOption.AllDirectories).Catch(typeof(UnauthorizedAccessException)).ToArray(); 

ExceptionExtensions :

static class ExceptionExtensions 
{ 
public static IEnumerable<TIn> Catch<TIn>(
      this IEnumerable<TIn> source, 
      Type exceptionType) 
{ 
    using (var e = source.GetEnumerator()) 
    while (true) 
    { 
     var ok = false; 

     try 
     { 
      ok = e.MoveNext(); 
     } 
     catch(Exception ex) 
     { 
      if (ex.GetType() != exceptionType) 
       throw; 
      continue; 
     } 

     if (!ok) 
      yield break; 

     yield return e.Current; 
    } 
} 
} 
+0

이 사진이 정상적으로 작동합니까? 'GetDirectories'는 폴더를 전체적으로 처리하며, 무단 액세스를 야기하는 하나의 폴더가 있다면 출력을 볼 수 없게됩니다. 적어도 내가 테스트 한 것입니다. – Wasp

+0

확장 메서드가 필요하다는 언급에 따라 @Wasp로 답변을 업데이트했습니다. –

1

System.IO 네임 스페이스의 File 및 Directory 클래스에 "CanRead"및 "CanWrite"라는 속성이 있다고 생각합니다. 당신은 당신이 권리가 있는지 여부를 판단하기 위해 그것들을 사용할 수 있습니다. 내가 아는

다른 방법은 코드 액세스 보안을 사용하고

죄송합니다 "수요"적절한 권한이 ...., 나는 회의에 갈 막있어하는 메소드를 작성하는 것입니다, 그러나 나는 당신에게 Google에 충분한 것을 주었다. 이 질문에 아직 확실한 대답이 없으면 나중에 더 자세히 설명하겠습니다.

2

여기에 LINQ가 필요한 이유가 없습니다. 단순하게 유지하면 문제를 디버그하는 데 도움이됩니다. 다음과 같이 시도하십시오.

DirectoryInfo[] directories = System.IO.Directory.GetDirectories(@"\\testnetwork\abc$", 
           "*.*", 
           SearchOption.AllDirectories); 
foreach (DirectoryInfo dir in directories) 
{ 
    try 
    { 
     Console.WriteLine(System.IO.Path.GetDirectoryName(f)); 
    } 
    catch(Exception ex) 
    { 
     // report an error or something 
    } 
} 
2

당신이해야 할 첫 번째 일은 사용하는 방법을 변경할 수 있습니다 : 그것은 결과를 얻을 수 있기 때문에

var files = from f in System.IO.Directory.EnumerateDirectories(
     @"\\testnetwork\abc$", 
     "*.*", 
     SearchOption.AllDirectories) 
select f; 

EnumerateDirectories 더 잘 작동하고, 여전히 발생 같은 강타가없는 폴더를 발견했을 경우와 같은 예외입니다. 는 결과를 얻을 수 있다는 사실은 그 출력의 상단에 구성 할 수있게 해준다, 그래서 우리는 다음과 같이 확장 메서드를 추가하는 경우 :

var files = from f in System.IO.Directory.EnumerateDirectories(
     @"\\testnetwork\abc$", 
     "*.*", 
     SearchOption.AllDirectories) 
     .Catch(typeof(UnauthorizedAccessException)) 
select f; 
: 우리가 이런 식으로 뭔가를 쓸 수 있습니다

다음
static class ExceptionExtensions 
{ 
    public static IEnumerable<TIn> Catch<TIn>(
       this IEnumerable<TIn> source, 
       Type exceptionType) 
    { 
     using (var e = source.GetEnumerator()) 
     while (true) 
     { 
      var ok = false; 

      try 
      { 
       ok = e.MoveNext(); 
      } 
      catch(Exception ex) 
      { 
       if (ex.GetType() != exceptionType) 
        throw; 
       continue; 
      } 

      if (!ok) 
       yield break; 

      yield return e.Current; 
     } 
    } 
} 

및 귀하의 출력은 여전히 ​​깨끗하고 구성 가능한 Linq 표현을 유지하면서 예상 한해야합니다. Catch 메서드의 아이디어는 다른 것들을 발생시키지 않고 주위에 원하지 않는 예외를 "삼키는"것입니다. 초안 구현이지만 아이디어를 얻을 수 있습니다.