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.

Foi útil?

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:

FileSystemInfo.Attributes Propriedade

FileAttributes enumeração

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top