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

时间:2010-09-22 11:31:14

标签: c# linq lambda

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

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

5 个答案:

答案 0 :(得分:17)

您不需要使用LINQ来执行此操作 - 它是built into the framework

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

if you're using .NET 4

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>