DirectoryInfo.GetDirectories()
을 반복적으로 사용하여 주어진 경로에서 모든 하위 디렉터리를 찾습니다. 그러나 시스템 폴더를 제외하고 싶은데 명확한 방법이 없습니다. FindFirstFile/FindNextFile에서 특성이 더 명확 해졌습니다.DirectoryInfo.GetDirectories() 및 특성
6
A
답변
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 링크 :
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에서 편집
당신이 먼저 메모리에 배열을 구축하지 않고 결과를 반복 할 수있는 대신 GetDirectories의 EnumerateDirectories을 사용하십시오 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
당신이 그것에서 속성을 얻는 방법, 궁극적 인 달콤한 Linq에
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
Directory.GetDirectories 문자열을 반환를 사용하십니까? :) – aku
@aku Directory.GetDirectories 정적이 아닌 DirectoryInfo.GetDirectories 인스턴스 메소드를 사용하고 있습니다. –
yield return을 사용하여 진정한 재귀 적 반복자를 만드는 것만큼 효율적/쓸모가 없습니다. SearchOption.AllDirectories를 사용하는 큰 디렉토리 계층 구조에서는별로 좋지 않습니다. – Ash