退出递归函数搜索子目录

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 也是如此,除非我在函数中创建它。文件条目也是如此 不,subsfileEntries 不需要 ref 【参考方案1】:

试试这个来获取目录:

public static IEnumerable<DirectoryInfo> DirectorySearch(DirectoryInfo dir)

    return
        dir
            .GetDirectories()
            .SelectMany(x => DirectorySearch(x))
            .StartWith(dir);

然后您可以通过DirectorySearch("C:\My\Path").SelectMany(x =&gt; 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;

我只是在脑海中写下了这个,所以你必须调试它,但它会给你一个我希望如何处理这个的想法。

【讨论】:

以上是关于退出递归函数搜索子目录的主要内容,如果未能解决你的问题,请参考以下文章

递归文件搜索的问题

第十一天python3 递归函数

如何退出方法,即如何从java中的递归函数返回?

从函数中退出以减少激活对象比递归或调用嵌套函数更好吗?

python学习week5-递归,匿名函数生成器

C语言解题篇一看就会用,超详细解析递归函数!!!