如何使用LINQ或LAMBDA表达式以递归方式从目录及其子文件夹中读取带有dll
扩展名的文件名。
现在我正在使用Nested for-each循环来执行此操作。 有没有办法使用LINQ或LAMBDA表达式?
答案 0 :(得分:17)
您不需要使用LINQ来执行此操作 - 它是built into the framework:
string[] files = Directory.GetFiles(directory, "*.dll",
SearchOption.AllDirectories);
IEnumerable<string> files = Directory.EnumerateFiles(directory, "*.dll",
SearchOption.AllDirectories);
说实话,LINQ在递归方面并不是很好。您可能想要编写自己的通用递归扩展方法。考虑到问这种问题的频率,我应该在某个时候做到这一点......
答案 1 :(得分:4)
这会返回只是文件名+扩展程序:
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);
答案 2 :(得分:3)
如果你真的想用递归的lambda表达式来做,你可以去:
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);
注意:这可能比之前的答案慢几倍(并且更难以读取/调试/维护),但如果某处出现I / O异常,它就不会停止。 / p>
答案 3 :(得分:2)
IEnumerable<string> filenames = Directory.GetFiles(searchDirectory, "*.dll",
SearchOption.AllDirectories)
.Select(s => Path.GetFileName(s));
Directory.GetFiles()
返回与指定目录中指定搜索模式匹配的文件的完整路径。 Select
将fullpath序列的每个元素投影到一个新表单中,只有文件名。
答案 4 :(得分:0)
通常使用位于System.IO
命名空间中的类来读取文件和目录。因此,第一步是使用Directory.EnumerateFiles方法获取您需要读取的所有文件,然后对应于您的搜索条件的每个文件使用例如File.ReadAllBytes方法读取内容。 / p>