2008-09-19 12 views
6

Ich verwende rekursiv DirectoryInfo.GetDirectories(), um alle Unterverzeichnisse unter einem bestimmten Pfad zu finden. Ich möchte jedoch die Systemordner ausschließen und es gibt keinen klaren Weg dafür. In FindFirstFile/FindNextFile waren die Dinge klarer mit den Attributen.DirectoryInfo.GetDirectories() und Attribute

Antwort

8

@rslite ist richtig, .NET nicht eine solche Filterung out-of-box nicht geben, aber es ist nicht schwer zu implementieren:

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 Links:

FileSystemInfo.Attributes Property

FileAttributes Enumeration

0

Sie müssten wahrscheinlich die Ergebnisse durchlaufen und diejenigen mit den Attributen ablehnen, die Sie nicht möchten (verwenden Sie die Attributes-Eigenschaft).

3

Dies ist ein großartiges Beispiel für ein Szenario, in dem Linq und Extension-Methoden die Dinge wirklich sauber und einfach machen.

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

Wenn Sie eine .net v2 Anwendung Gebäude sind, dann können Sie LinqBridge verwenden Sie alle kühlen Linq zu Objekten Methoden zugreifen zu geben (wie Wo() und ToArray() oben).

bearbeiten

In .net v4 Sie EnumerateDirectories statt GetDirectories verwenden würde, die Sie zum ersten Mal im Speicher ohne den Aufbau einer Anordnung über die Ergebnisse iterieren ermöglicht.

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 Strings zurückgibt, wie Sie Attribute von ihm bekommen haben? :) – aku

+0

@aku Ich verwende die DirectoryInfo.GetDirectories Instanz Methode, nicht die Directory.GetDirectories statische. –

+0

Nicht so effizient/benutzbar wie die Erstellung eines echten rekursiven Iterators mit Rendite. Auf großen Verzeichnishierarchien mit SearchOption.AllDirectories ist nicht so gut. – Ash

0

Mit der ultimative Süße Linq

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