DirectoryInfo.GetDirectories() e gli attributi
-
01-07-2019 - |
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.
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:
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);