代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

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

  •  5
  • Thorin Oakenshield  · 技术社区  · 14 年前

    如何读取文件名 dll 使用Linq或lambda表达式从目录及其子文件夹递归扩展。

    现在,我使用嵌套for each循环来完成这项工作。 使用LINQ或lambda表达式有什么方法可以做到这一点吗?

    5 回复  |  直到 14 年前
        1
  •  17
  •   Jon Skeet    14 年前

    你不需要用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在递归方面不是很好。您可能希望编写自己的通用递归扩展方法。考虑到这类问题被问到的频率,我真的应该自己做一段时间…

        2
  •  4
  •   syntaxcheck    14 年前

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

    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);
    
        3
  •  3
  •   Francesco De Vittori    14 年前

    如果您真的想用递归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异常,它不会停止。

        4
  •  2
  •   Julien Hoarau    14 年前
    IEnumerable<string> filenames = Directory.GetFiles(searchDirectory, "*.dll",
                                                       SearchOption.AllDirectories)
                                             .Select(s => Path.GetFileName(s));
    

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

        5
  •  0
  •   Darin Dimitrov    14 年前

    读取文件和目录通常使用位于 System.IO 命名空间。因此,第一步是使用 Directory.EnumerateFiles 方法,然后对于与搜索条件相对应的每个文件,使用例如 File.ReadAllBytes 方法。

    推荐文章