Frage

Ich bin mit DirectoryInfo.GetDirectories() rekursiv alle Unterverzeichnisse unter einem bestimmten Pfad zu finden. Allerdings mag ich die System-Ordner ausschließen und es gibt keine klare Art und Weise dafür. In Findfirstfile / Findnextfile Dinge klarer mit den Attributen.

War es hilfreich?

Lösung

@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

Andere Tipps

Dies ist ein großartiges Beispiel für ein Szenario, in dem Linq und Erweiterungsmethoden Dinge wirklich sauber und einfach zu 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 geben Sie Methoden Objekte zu allen kühlen Linq zugreifen (wie Wo () und ToArray () oben).

Bearbeiten

In .net v4 würden Sie verwenden EnumerateDirectories statt GetDirectories denen Hier können Sie die Ergebnisse iterieren, ohne zuerst ein Array im Speicher zu bauen.

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

Sie würden wahrscheinlich eine Schleife durch die Ergebnisse haben und die mit den Attributen ablehnen, die Sie nicht wollen, (verwenden Sie die Eigenschaft Attribute).

Mit der ultimative Süße Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top