使用Recursion的层次树太大,使文件搜索崩溃

时间:2012-06-17 03:02:44

标签: c linux file ubuntu recursion

我编写了一个用于搜索特定文件的代码,用户在其中输入起始路径和文件名,然后程序会在文件存在时打印其详细信息,否则打印不会显示。

正如我所怀疑的那样,当层次结构树太大时,使用递归会导致代码崩溃,我已尝试使用400个目录但它失败了,所以我想在50文件夹之后有一个内部另一方面,递归的开销使代码崩溃。

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

2 个答案:

答案 0 :(得分:3)

最肮脏的方法是increase stack size

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

可能最好的方法是废弃该代码并使用强大无所不在的find

答案 1 :(得分:3)

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

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

在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不是目录,并且此不是递归,则需要进行特殊处理。