【发布时间】:2016-12-18 18:16:27
【问题描述】:
我正在编写一个程序来查找计算机上某种类型的所有文件(当前是图像文件),并且我正在使用尾递归以这种方式搜索目录:
private void ImageSearchByDir(DirectoryInfo dir)
{
//search for images by directory, later display them with this method when I get basic search working
foreach (var f in dir.GetFiles())
{
//add file info to current list
this.myfiles.Add(f);
}
foreach (var d in dir.GetDirectories())
{
//recursive call to iterate through subdirectories
ImageSearchByDir(d);
}
}
在搜索包含大量文件的目录时似乎会出现此问题。例如,我搜索了一个文件夹,其中包含约 700 张图像,这些图像位于 3 级文件夹下,没有问题,但尝试搜索我的桌面会使程序崩溃。我认为这与递归和产生的堆栈大小有关,如果可能的话,我想实现一个更优雅的解决方案(我已经阅读了蹦床,但我不能 100% 确定会解决这个问题)。
【问题讨论】:
-
1) 你收到了什么样的异常? 2) 可能只收集文件名作为string,而不是FileInfo?
-
您正在做的是递归,但不符合尾递归的条件。尾递归要求在调用自身后函数中没有额外的操作。在您的情况下,foreach 循环必须在每次递归调用后运行其检查更多项目,从而使此非尾递归。 Luiso 的回答提供了一种完全无需递归的方法。
-
回复Jackdaw我没有收到任何错误,程序只是停留在加载状态(白色背景,蓝色窗口加载圆圈光标,单击它会将其标记为“无响应”)。 Gideon 你说得很好,如果我的措辞具有误导性,请见谅。
标签: c# file recursion directory stack-overflow