退出递归函数搜索子目录
Posted
技术标签:
【中文标题】退出递归函数搜索子目录【英文标题】:Exiting Recursive function searching subdirectories 【发布时间】:2018-11-21 08:51:14 【问题描述】:我正在尝试以递归方式获取给定目录中所有子目录的列表,因为现有命令显然不够好。 我可以成功获取目录,但似乎无法离开递归算法。我敢肯定,一定有一种我没有看到的简单方法。任何帮助都会很棒!
public static public void directorySearch(ref List<DirectoryInfo> subs, ref DirectoryInfo dir, ref List<FileInfo> fileEntries, ref int k)
do
foreach (DirectoryInfo elements in dir.GetDirectories())
subs.Add(elements);
k++;
DirectoryInfo fi = subs[k];
directorySearch(ref subs, ref fi, ref fileEntries, ref k);
while (??????);
//This will be used once function is working to get files in all directories
/*
foreach (FileInfo f in dir.GetFiles()
fileEntries.Add(f);
*/
【问题讨论】:
你为什么要通过ref
传递参数?只有k
似乎需要它。
Subs 也是如此,除非我在函数中创建它。文件条目也是如此
不,subs
和 fileEntries
不需要 ref
。
【参考方案1】:
试试这个来获取目录:
public static IEnumerable<DirectoryInfo> DirectorySearch(DirectoryInfo dir)
return
dir
.GetDirectories()
.SelectMany(x => DirectorySearch(x))
.StartWith(dir);
然后您可以通过DirectorySearch("C:\My\Path").SelectMany(x => x.GetFiles())
获取文件。
或者你可以使用这个:
public static IEnumerable<DirectoryInfo> DirectorySearch(DirectoryInfo dir)
yield return dir;
foreach (DirectoryInfo x in dir.GetDirectories())
foreach (DirectoryInfo y in DirectorySearch(x))
yield return y;
甚至这个:
public static List<DirectoryInfo> DirectorySearch(DirectoryInfo dir)
List<DirectoryInfo> subs = new List<DirectoryInfo>();
subs.Add(dir);
foreach (DirectoryInfo x in dir.GetDirectories())
foreach (DirectoryInfo y in DirectorySearch(x))
subs.Add(y);
return subs;
【讨论】:
@Hooch - 三者的功能相同。【参考方案2】:你不需要循环。使用using System.Collections.Generic
中的内置类
这将递归搜索:
public static IEnumerable<DirectoryInfo> GetSubdirectories(string path)
return new DirectoryInfo(path).EnumerateDirectories("*",SearchOption.AllDirectories);
【讨论】:
所以我们特别不能使用 AllDirectories 选项【参考方案3】:您需要检查您当前处理的目录是否真的有子目录。如果是,你就做subs.Add(elements)
,如果不是,你return
。这就是导致函数在到达末尾时停止的原因。
foreach (DirectoryInfo elements in dir.GetDirectories())
subs.Add(elements);
k++;
DirectoryInfo fi = subs[k];
if (fi[k].GetDirectories().length > 0)
directorySearch(ref subs, ref fi, ref fileEntries, ref k);
else
return;
我只是在脑海中写下了这个,所以你必须调试它,但它会给你一个我希望如何处理这个的想法。
【讨论】:
以上是关于退出递归函数搜索子目录的主要内容,如果未能解决你的问题,请参考以下文章