2008-09-19 7 views
6

DirectoryInfo.GetDirectories()을 반복적으로 사용하여 주어진 경로에서 모든 하위 디렉터리를 찾습니다. 그러나 시스템 폴더를 제외하고 싶은데 명확한 방법이 없습니다. FindFirstFile/FindNextFile에서 특성이 더 명확 해졌습니다.DirectoryInfo.GetDirectories() 및 특성

답변

8

@rslite는 .NET은 아웃 - 오브 - 박스 등의 필터링을 제공하지 않습니다, 권리이지만, 구현하기 어렵지 않다 :

static IEnumerable<string> GetNonSystemDirs(string path) 
{ 
    var dirs = from d in Directory.GetDirectories(path) 
       let inf = new DirectoryInfo(d) 
       where (inf.Attributes & FileAttributes.System) == 0 
       select d; 

    foreach (var dir in dirs) 
    { 
     yield return dir; 
     foreach (var subDir in GetNonSystemDirs(dir)) 
     { 
      yield return subDir; 
     } 
    } 
} 

MSDN 링크 :

FileSystemInfo.Attributes Property

FileAttributes Enumeration

0

아마도 결과를 반복하고 원하지 않는 속성을 가진 속성을 거부해야합니다 (Attributes 속성 사용).

3

이것은 Linq 및 확장 방법을 사용하여 매우 쉽고 간단하게 만드는 시나리오의 좋은 예입니다. 당신은 닷넷 v2 애플리케이션을 구축하는 경우

public static DirectoryInfo[] GetNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.GetDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0) 
     .ToArray(); 
} 

, 당신은 당신이 (여기서()와 ToArray() 위와 같이) 객체 메소드에 모든 멋진 Linq에 대한 액세스를 제공하는 LinqBridge를 사용할 수 있습니다.

.NET에서 편집

당신이 먼저 메모리에 배열을 구축하지 않고 결과를 반복 할 수있는 대신 GetDirectoriesEnumerateDirectories을 사용하십시오 V4.

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.EnumerateDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0); 
} 
+0

Directory.GetDirectories 문자열을 반환를 사용하십니까? :) – aku

+0

@aku Directory.GetDirectories 정적이 아닌 DirectoryInfo.GetDirectories 인스턴스 메소드를 사용하고 있습니다. –

+0

yield return을 사용하여 진정한 재귀 적 반복자를 만드는 것만큼 효율적/쓸모가 없습니다. SearchOption.AllDirectories를 사용하는 큰 디렉토리 계층 구조에서는별로 좋지 않습니다. – Ash

0

당신이 그것에서 속성을 얻는 방법, 궁극적 인 달콤한 Linq에

IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);