【问题标题】:How to get filepaths recursively in c#? [duplicate]如何在 C# 中递归获取文件路径? [复制]
【发布时间】:2016-04-06 01:30:40
【问题描述】:

我创建了下面的解决方案来返回所有文件路径,但它似乎只适用于一个文件夹。有什么建议我做错了吗?

    public static List<string> GetFilePaths(string dir)
    {
        var dirs = Directory.GetDirectories(dir);
        if (dirs.Count() > 0)
        {
            foreach (var pwd in dirs)
            {
                return GetFilePaths(pwd).ToList();
            }
        }

        return Directory.GetFiles(dir).ToList();
    }

【问题讨论】:

  • 有什么理由不使用Directory.EnumerateFiles?只需Directory.EnumerateFiles(path, "*.*", SearchOptions.AllDirectories)
  • 您是否知道 GetDirectories 以及 GetFiles 具有允许您搜索子文件夹并使所有这些递归方法无用的重载?

标签: c# .net


【解决方案1】:

您在每次循环迭代后使用return。这将导致函数在第一次迭代中返回,其余部分将变得无用。而是在开头声明一个List,然后继续添加它,最后返回它。

public static List<string> GetFilePaths(string dir)
{
    var result = new List<string>;
    var dirs = Directory.GetDirectories(dir);
    if (dirs.Count() > 0)
    {
        foreach (var pwd in dirs)
        {
            result.AddRange(GetFilePaths(pwd));
        }
    }

    result.AddRange(GetFilePaths(dir));
    return result;
}

【讨论】:

    【解决方案2】:

    您将在第一次迭代中从循环中返回。您应该将结果累积在某种变量中:

    var filePaths = new List<string>();
    foreach (var subDir in Directory.GetDirectories(dir))
    {
        filePaths.AddRange(GetFilePaths(subDir);
    }
    

    或使用 LINQ:

    var filePaths = Directory.GetDirectories(dir).SelectMany(s => GetFilePaths(s));
    

    【讨论】:

      【解决方案3】:

      您应该为每个文件夹填充列表。

      public static List<string> GetFilePaths(string dir)
      {
          var dirs = Directory.GetDirectories(dir);
          var returnList = new List<string>();
      
          if (dirs.Count() > 0)
          {
              foreach (var pwd in dirs)
              {
                  returnList.AddRange(GetFilePaths(pwd));
              }
          }
      
          returnList.AddRange(Directory.GetFiles(dir));
          return returnList;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2012-12-29
        相关资源
        最近更新 更多