Question

J'utilise DirectoryInfo.GetDirectories () pour rechercher 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 attributs étaient plus clairs.

Était-ce utile?

La solution

@rslite a raison, .NET ne donne pas un tel filtrage tel quel, 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:

Propriété FileSystemInfo.Attributes

Énumération FileAttributes

Autres conseils

C’est un excellent exemple de scénario dans lequel Linq et les méthodes d’extension rendent les choses vraiment simples et propres.

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 .net v2, vous pouvez utiliser LinqBridge pour vous donner accès à toutes les méthodes Linq to object (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 d'abord créer un tableau en mémoire.

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

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

Utilisation de l'ultime Sweet Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top