Linq Coletando Nomes de Arquivos Recursivamente

Eu uso este trecho de código para reunir caminhos fora do disco rígido. O mesmo padrão funciona para muitas outras travessias de árvore.

public static IEnumerable<string> Files(
this string root, Func<string, bool> accept)
{
return
Directory.GetFiles(root).Where(accept)
.Concat(
Directory.GetDirectories(root)
.SelectMany(d => d.Files(accept)));
}

Como extensão, funciona assim:

@"Sumblime 2Packages".Files(
s
=> s.EndsWith("tmLanguage");

Felicidades