如何在c#中递归获取文件路径?

时间:2016-01-01 15:00:43

标签: c# .net

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

    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();
    }

3 个答案:

答案 0 :(得分:2)

在循环的每次迭代后使用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;
}

答案 1 :(得分:0)

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

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));

答案 2 :(得分:0)

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

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;
}