DirectoryInfo.GetDirectories () e atributos
-
01-07-2019 - |
Pergunta
Eu estou usando DirectoryInfo.GetDirectories()
recursivamente para encontrar os todos os sub-diretórios sob um determinado caminho.
No entanto, eu quero excluir as pastas do sistema e não há nenhuma maneira clara para isso.
Em FindFirstFile / FindNextFile coisas eram mais claras com os atributos.
Solução
@rslite é certo, não .NET não dá essa filtragem out-of-box, mas não é difícil de implementar:
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;
}
}
}
ligações MSDN:
Outras dicas
Este é um grande exemplo de um cenário onde os métodos LINQ e extensão tornar as coisas realmente limpo e fácil.
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 você está construindo uma aplicação .net v2, então você pode usar LINQBridge para lhe dar acesso a todos os legal Linq para métodos objectos (como onde () e ToArray () acima).
Editar
Em .net v4 você pode usar EnumerateDirectories vez de GetDirectories que permite interagir sobre os resultados sem a construção de uma matriz na memória em primeiro lugar.
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
Você provavelmente tem que percorrer os resultados e rejeitar aqueles com os atributos que você não quer (use a propriedade Atributos).
Usando o máximo doce Linq
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);