【问题标题】:c# Stack overflow error with recursionc# 递归堆栈溢出错误
【发布时间】:2016-11-11 19:30:42
【问题描述】:

我在服务器上做了一个完整的文件夹列表,但是大约有65000个StackOverFlowException共享,有一个异常。如何出行

static List<string> FolderList = new List<string>();
static void Selection(DirectoryInfo dir)
{
    FolderList.Add(dir.FullName);
    foreach (var a_dir in dir.GetDirectories())
    {
        Selection(a_dir);
    }
}

【问题讨论】:

  • 当您提出问题时,文本区域右侧有一个橙色的大如何格式化框,其中包含有用的信息。还有一个完整的格式化辅助工具栏。还有一个 [?] 按钮提供格式化帮助。 并且一个预览区域位于文本区域和发布您的问题按钮之间(这样您就必须滚动过去才能找到该按钮,以鼓励您查看它)显示您的帖子发布时的样子。使您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。
  • (这次我已经为你修好了。)
  • 使用调试器单步调试代码。这比询问陌生人代码有什么问题要快得多,也能提供更多信息。
  • 使用overload of GetDirectories 为您“辛苦”工作怎么样?

标签: c# recursion stack-overflow


【解决方案1】:

当深度未知时使用递归不是一个好习惯。或者,您可以使用 GetDirectories 的重载(它使用 Stack 数据结构而不是递归):

static List<string> FolderList = new List<string>();
static void Selection(DirectoryInfo dir)
{
    var dirs = dir.GetDirectories("*", SearchOption.AllDirectories);
    foreach (var a_dir in dirs)
    {
        FolderList.Add(dir.FullName);
    }
}

如果仍然遇到异常,则需要将逻辑更改为传统的while循环。

GetDirectories 的以下文档:

搜索模式:

与名称匹配的搜索字符串 目录。此参数可以包含有效文字的组合 路径和通配符(* 和?)字符(见备注),但不 支持正则表达式。默认模式是“*”,它返回 所有文件。

搜索选项:

枚举值之一,指定搜索操作 > 应该只包括当前目录还是所有子目录

【讨论】:

  • 这是递归的(即返回子文件夹中的所有子文件夹)?
  • @YosiDahari 我检查了实现,它在内部使用堆栈而不是递归函数。
  • @YosiDahari 的意思是问该方法是否返回所有个文件夹,包括文件夹内文件夹内文件夹等等?
  • @EvilTak 如上述文档所述包括所有子目录
猜你喜欢
  • 2018-03-10
  • 2014-08-27
  • 1970-01-01
  • 2017-01-20
  • 2015-06-17
  • 1970-01-01
  • 2012-08-20
  • 2016-12-30
  • 2015-02-08
相关资源
最近更新 更多