我要编写一个方法(或2个方法),它应该返回文件夹层次结构中所有文件的列表(包含所有子文件夹)。 当我填写全局列表时,我知道如何处理它。这对我有用(这不是我的问题)。 但我想在方法中填充List,因此我遇到了递归的问题。 到目前为止我在这里:
public List<string> GetAllFiles(string path)
{
List<string> files = new List<string>();
FindFiles(files, path);
return files;
}
private void FindFiles(List<string> files, string path)
{
if (Directory.Exists(path))
{
try
{
foreach (string folder in Directory.GetDirectories(path))
{
FindFiles(files, folder);
}
foreach (string file in Directory.GetFiles(path).ToArray())
{
files.Add(file);
}
}
catch (Exception)
{
// ignored
}
}
}
这项工作有效,但我将List作为参考传递,在我看来这不是一个干净的方式。 如何“正常”处理它? 提前谢谢。
答案 0 :(得分:2)
你的方法很干净,因为它可以让你创建一次列表,填写它,然后返回给调用者,而不会产生重复。
鉴于方法签名返回List<string>
,另一种替代方案会稍微浪费一些,因为它会在层次结构的每个级别创建丢弃列表:
public List<string> GetAllFiles(string path) {
var res = new List<string>();
if (Directory.Exists(path)) {
try {
foreach (var folder in Directory.GetDirectories(path)) {
res.AddRange(GetAllFiles(folder));
}
foreach (var file in Directory.GetFiles(path)) {
res.Add(file);
}
} catch (Exception) {
// ignored
}
}
return res;
}
LINQ使这更加简洁,但方法仍然相同:
public List<string> GetAllFiles(string path) {
if (!Directory.Exists(path)) {
return new List<string>();
}
try {
return Directory.GetDirectories(path).SelectMany(folder => GetAllFiles(folder))
.Concat(Directory.GetFiles(path)).ToList();
} catch (Exception) {
return new List<string>();
}
}
答案 1 :(得分:2)
您可以尝试使用yield return添加到列表中。
public List<string> GetAllFiles(string path)
{
List<string> files = new List<string>();
foreach (string file in FindFiles(path))
{
files.Add(file);
}
return files;
}
private IEnumerable<string> FindFiles(string path)
{
if (Directory.Exists(path))
{
try
{
foreach (string folder in Directory.GetDirectories(path))
{
foreach (string file in FindFiles(files, folder))
{
yield return file;
}
}
foreach (string file in Directory.GetFiles(path).ToArray())
{
yield return file;
}
}
catch (Exception)
{
// ignored
}
}
}