Si realmente desea hacerlo con una expresión lambda recursiva Aquí van:
Action<string, List<string>> discoverFiles = null;
discoverFiles = new Action<string, List<string>>((dir, list) =>
{
try
{
foreach (var subDir in Directory.GetDirectories(dir))
discoverFiles(string.Concat(subDir), list);
foreach (var dllFile in Directory.GetFiles(dir, "*.dll"))
{
var fileNameOnly = Path.GetFileName(dllFile);
if (!list.Contains(fileNameOnly))
list.Add(fileNameOnly);
}
}
catch (IOException)
{
// decide what to do here
}
});
// usage:
var targetList = new List<string>();
discoverFiles("c:\\MyDirectory", targetList);
foreach (var item in targetList)
Debug.WriteLine(item);
Nota: esto es probablemente varias veces más lento (y mucho más difícil de leer/debug/mantener) que la respuestas anteriores, pero no se detiene si hay una excepción de E/S en alguna parte.
gracias ... que incluye la ruta de acceso total. Solo necesito el nombre del archivo como 'foo.dll ' –
@Pramodh: así que use' Path.GetFileName' también. –
Vale la pena señalar que estos métodos tienen graves fallas, sin embargo, si se produce alguna excepción de E/S, se cancela todo el resultado. En la variante GetFiles, esto significa que generalmente no arroja ningún resultado, y en la variante EnumerateFiles, la enumeración se detendrá cada vez que se produzca el primer error de E/S (como el permiso denegado). –