Как получить рекурсивные пути к файлу в С#?

120
11

Я создал решение ниже, чтобы вернуть все пути к файлу, но он работает только для одной папки. Любые предложения, что я делаю неправильно?

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

спросил(а) 2021-01-28T02:01:10+03:00 4 недели, 1 день назад
1
Решение
74

Вы используете 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;
}

ответил(а) 2021-01-28T02:01:10+03:00 4 недели, 1 день назад
44

Вы должны заполнить список для каждой папки.

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

ответил(а) 2021-01-28T02:01:10+03:00 4 недели, 1 день назад
43

Вы возвращаетесь из цикла в первую итерацию. Вы должны либо накапливать свои результаты в какой-то переменной:

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

ответил(а) 2021-01-28T02:01:10+03:00 4 недели, 1 день назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема