2008-09-19 9 views
6

J'utilise DirectoryInfo.GetDirectories() récursivement pour trouver tous les sous-répertoires sous un chemin donné. Cependant, je veux exclure les dossiers système et il n'y a pas de moyen clair pour cela. Dans FindFirstFile/FindNextFile, les choses étaient plus claires avec les attributs.DirectoryInfo.GetDirectories() et les attributs

Répondre

8

@rslite est juste, .NET ne donne pas un tel filtrage hors-box, mais ce n'est pas difficile à mettre en œuvre:

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; 
     } 
    } 
} 

liens MSDN:

FileSystemInfo.Attributes Property

FileAttributes Enumeration

0

Vous devrez probablement parcourir les résultats et rejeter ceux avec les attributs que vous ne voulez pas (utilisez la propriété Attributes).

3

Ceci est un excellent exemple d'un scénario où Linq et les méthodes d'extension rendent les choses vraiment propres et faciles.

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

Si vous construisez une application v2 .net, vous pouvez utiliser LinqBridge pour vous donner accès à tous les Linq frais aux méthodes d'objets (comme where() et ToArray() ci-dessus).

Modifier

Dans .net v4 vous utiliseriez EnumerateDirectories au lieu de GetDirectories qui vous permet de parcourir les résultats sans la construction d'un tableau en mémoire d'abord.

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 comment obtenez-vous les attributs de ce? :) – aku

+0

@aku J'utilise la méthode d'instance DirectoryInfo.GetDirectories, pas la méthode statique Directory.GetDirectories. –

+0

Pas aussi efficace/utilisable que de créer un vrai itérateur récursif en utilisant le rendement de rendement. Sur les grandes hiérarchies de répertoires utilisant SearchOption.AllDirectories n'est pas si bon. – Ash

0

En utilisant le renvoie des chaînes, doux ultime Linq

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