2010-04-01 1 views
5

모든 예제는 파일을 하위 디렉토리에있는 파일을 재귀 적으로 가져 오는 것만 보이는 것처럼 보입니다. 내가 뭘 하려는지 "xxx"라는 특정 하위 디렉토리에 대한 폴더를 검색 다음 다른 것들을 위해 사용할 수 있도록 변수에 그 경로를 저장합니다.C# 하위 디렉토리 검색 (파일 제외)

모든 디렉토리를 반복하고 이름을 비교하지 않고도이 작업을 수행 할 수 있습니까?

답변

8

Directory.GetDirectories(root); 

당신에게 서브 디렉토리의 배열을 반환합니다 여기에서 자세한 내용입니다.

그런 다음 당신이 관심있는 일을 찾기 위해 Linq를 사용할 수 있습니다 : 코드에서 루프 아니지만, 그럼에도 불구하고 여전히 루프

IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test")); 

합니다. 따라서 궁극적 인 대답은 "반복하지 않고 폴더 '테스트'를 찾을 수 없다는 것입니다.

Linq에 .SingleOrDefault()을 추가 할 수 있지만 "test"폴더를 찾을 수없는 경우 수행하려는 작업에 따라 다릅니다.

GetDirectories 호출에 SearchOption SearchOption.AllDirectories을 포함하도록 변경하면 재귀도 수행됩니다. 분명히이 경우 호출은 디렉토리 트리에 "test"라는 폴더가 두 개 이상있는 경우 둘 이상의 항목을 반환 할 수 있습니다.

+1

+1 여기 –

+0

@David - 실제로 하위 디렉토리를 찾을 수없는 경우 아무 것도 반환하지 않을 수도 있습니다. 내 대답을 업데이트 할게. – ChrisF

+0

@ChrisF, 예 "..OrDefault "는 일치하는 항목이없는 경우 null을 반환한다는 것을 의미합니다. 내가 말한 내용에서 미묘한 부분을 놓치지 않는 한 :-( –

0

예, 제 3 자 라이브러리가 부족한 유일한 해결책은 이름 비교를 통해 디렉토리를 재귀 적으로 검색하는 것입니다.

1

우선 "모든 디렉토리를 반복하고 이름을 비교하지 않고는 불가능합니다."

저는 실제 질문은 "모든 디렉토리를 반복하면서 이름을 비교하여 처리하는 기존 API가 있습니까?"라고 생각합니다.

예, 있습니다. Directory.Exists()라고 :

var xxxPath = Path.Combine(parentFolder, "xxx"); 
if (Directory.Exists(xxxPath)) 
    savedPath = xxxPath; 
6
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories) 

이 주어진 이름을 발견 모든 폴더와 문자열 배열을 반환합니다. 마지막 매개 변수를 변경하여 최상위 디렉토리 만 검사하고 루트를 변경하여 시작 위치를 조정할 수 있습니다.

public static string FindGitPath(string firstFilter, string secondFilter, string initialPath) 
    { 
     string gitPath = string.Empty; 
     foreach (var i in Directory.GetDirectories(initialPath)) {   
      try { 
       foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) { 
        foreach (var s in Directory.GetDirectories(f)) { 
         if (s == Path.Combine(f,secondFilter)) { 
          gitPath = f; 
          break; 
         } 
        } 
       }  
      } catch (UnauthorizedAccessException) { 
       Console.WriteLine("Path is not accessible: {0}", i); 
      }        
     } 
     return gitPath; 
    } 

사용 예 :

Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\")); 
0

가 UnauthorizedAccessException 대한 고려하여 두 개의 필터를 사용하여 폴더를 검색하기위한 단편이며, 하나 개의 필터를 사용하기 위해 리팩토링 수 "이 항목은 하나의 항목 만 반환해야합니다." .SingleOrDefault()를 문장의 끝에 추가하여 계약을 만들 수 있습니다 :-) EDIT : 그리고 분명히 문자열을 반환합니다. doh