Nếu bạn thực sự muốn làm điều đó với một biểu thức lambda đệ quy ở đây bạn đi:
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);
Lưu ý: điều này có lẽ chậm hơn (và cách khó khăn hơn để đọc/debug/duy trì) nhiều lần so với câu trả lời trước đó, nhưng nó không dừng lại nếu có một ngoại lệ I/O ở đâu đó.
Nguồn
2010-09-22 12:37:36
cảm ơn bạn ... nó bao gồm các tổng con đường. Tôi chỉ cần tên của tập tin như 'foo.dll ' –
@Pramodh: Vì vậy, hãy sử dụng' Path.GetFileName'. –
Cần lưu ý rằng những phương pháp này có những sai sót nghiêm trọng, tuy nhiên: nếu bất kỳ ngoại lệ I/O nào xảy ra, toàn bộ kết quả sẽ bị hủy bỏ. Trong biến thể GetFiles, điều này có nghĩa là nó thường trả về không có kết quả nào, và trong biến thể EnumerateFiles, liệt kê sẽ bị tạm dừng bất cứ khi nào xuất hiện lỗi I/O đầu tiên (chẳng hạn như quyền bị từ chối). –