Domanda

Sto usando DirectoryInfo.GetDirectories() in modo ricorsivo per trovare tutte le sottodirectory in un determinato percorso.Tuttavia, voglio escludere le cartelle di Sistema e non c'è modo chiaro per che.In FindFirstFile/FindNextFile le cose erano più chiare, con gli attributi.

È stato utile?

Soluzione

@rslite è giusto .NET non dare filtraggio out-of-box, ma non è difficile da implementare:

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

FileSystemInfo.Gli Attributi Della Proprietà

FileAttributes Enumerazione

Altri suggerimenti

Questo è un grande esempio di uno scenario in cui Linq e metodi di estensione rendere le cose davvero pulito e facile.

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

Se si sta costruendo una .net v2 applicazione, quindi è possibile utilizzare LinqBridge per dare accesso a tutte le cool Linq to objects metodi (come Dove() e ToArray() di cui sopra).

Modifica

In .net v4 devi utilizzare EnumerateDirectories invece di GetDirectories che permette di scorrere i risultati senza la costruzione di un array in memoria.

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

Si sarebbe probabilmente necessario per scorrere i risultati e rifiutare quelli con gli attributi che non voglio (utilizzare la proprietà di Attributi).

Utilizzando l'ultimo Dolce Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top