【问题标题】: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。

标签: c# .net recursion


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2013-06-17
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多