如何使用LINQ从子文件夹递归读取文件名

如何使用LINQ或LAMBDA表达式以递归方式从目录及其子文件夹中读取带有dll扩展名的文件名。

现在我正在使用嵌套for-each循环来执行此操作。 有没有办法使用LINQ或LAMBDA表达式?

您不需要使用LINQ来执行此操作 – 它内置于框架中 :

 string[] files = Directory.GetFiles(directory, "*.dll", SearchOption.AllDirectories); 

或者如果您使用的是.NET 4 :

 IEnumerable files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories); 

说实话,LINQ在递归方面并不是很好。 您可能想要编写自己的通用递归扩展方法。 考虑到这类问题经常被问到,我自己应该这样做一段时间……

这只返回文件名+扩展名:

 DirectoryInfo di = new DirectoryInfo(@"d:\somewhere\"); var q = from i in di.GetFiles("*.dll", SearchOption.AllDirectories) select i.Name; 

这只返回没有扩展名的文件名:

 DirectoryInfo di = new DirectoryInfo(@"d:\somewhere\"); var q = from i in di.GetFiles("*.dll", SearchOption.AllDirectories) select System.IO.Path.GetFileNameWithoutExtension(i.Name); 

如果你真的想用递归的lambda表达式来做,你去:

 Action> discoverFiles = null; discoverFiles = new Action>((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(); discoverFiles("c:\\MyDirectory", targetList); foreach (var item in targetList) Debug.WriteLine(item); 

注意:这可能比以前的答案慢几倍(并且更难以读取/调试/维护),但如果某处存在I / Oexception,它不会停止。

 IEnumerable filenames = Directory.GetFiles(searchDirectory, "*.dll", SearchOption.AllDirectories) .Select(s => Path.GetFileName(s)); 

Directory.GetFiles()返回与指定目录中指定搜索模式匹配的文件的完整路径。 Select将fullpath序列的每个元素项目分成新表单,只选择文件名。

读取文件和目录通常使用位于System.IO命名空间中的类来完成。 因此,第一步是使用Directory.EnumerateFiles方法获取需要读取的所有文件,然后对应于您的搜索条件的每个文件使用例如File.ReadAllBytes方法读取内容。