DirectoryInfo.GetDirectories () et attributs
-
01-07-2019 - |
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.
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:
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);