C语言 使用递归的层次结构树太大,导致文件搜索崩溃



我写了一个用于搜索特定文件的代码,其中用户输入起始路径和文件名,然后程序打印其详细信息(如果文件存在),或者打印未找到。

正如我所怀疑的,当层次结构树太大时,使用递归会使代码崩溃,我尝试过 400 个目录并失败了,所以我想在类似50文件夹一个内部到另一个之后,递归的开销使代码崩溃。

有什么建议如何解决这个问题吗? 基本上代码对于低级树层次结构是可以的,但我需要为健康的树设计它(500-600 个文件夹一个在另一个里面,还有一个存储在最后一个文件夹中的文件),谢谢

您可以通过存储您看到的目录(而不是立即处理它们)然后在以后的迭代中返回它们来删除递归(即转换为迭代解决方案)。但是,您可能不会获得完全相同的输出(事物的顺序可能不同)。

此方法的工作方式是具有要处理的目录列表,然后浏览此列表(随时向其添加任何子目录)。

在 psuedocode/Python 中:

def print_dirs(path, recursive, filename):
   dir_stack = empty stack
   dir_stack.push(path)
   while dir_stack is not empty:
      dir = dir_stack.pop() # returns the head element (and removes it)
      for file in children(dir):
         # ...do stuff with names...
         if recursive and file is a directory:
             dir_stack.push(file) # process the directory later

堆栈可以相当容易地实现为单链表。请注意,如果path不是目录,则需要特殊处理,并且这不是递归的。

最肮脏的方法是增加堆栈大小。

第二种是将char full_name[_POSIX_PATH_MAX + 1]替换为char *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char)),并且不要忘记在递归调用后free()它。

也许最好的办法是废弃该代码并使用强大的无所不在的find

最新更新