문제

나는 사용하고있다 DirectoryInfo.GetDirectories() 주어진 경로 아래의 모든 하위 디렉터리를 재귀적으로 찾습니다.그러나 시스템 폴더를 제외하고 싶은데 이에 대한 명확한 방법이 없습니다.FindFirstFile/FindNextFile에서는 속성이 더 명확해졌습니다.

도움이 되었습니까?

해결책

@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 속성

FileAttributes 열거

다른 팁

이는 Linq 및 확장 메서드를 사용하여 작업을 정말 깔끔하고 쉽게 만드는 시나리오의 좋은 예입니다.

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

.net v2 애플리케이션을 구축하는 경우 다음을 사용할 수 있습니다. LinqBridge 위의 Where() 및 ToArray()와 같은 객체 메서드에 대한 모든 멋진 Linq에 대한 액세스를 제공합니다.

편집하다

.net 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);
}

결과를 반복하여 원하지 않는 속성이 있는 결과를 거부해야 할 수도 있습니다(속성 속성 사용).

궁극의 Sweet Linq 사용

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top