我正在编写一个程序来查找计算机上所有类型的文件(当前是图像文件),并且我正在使用尾递归以这种方式搜索目录:
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);
}
}
在搜索包含大量文件的目录时,似乎会出现此问题。例如,我搜索了一个文件夹,其中包含3个级别文件夹下的约700个图像,没有任何问题,但是尝试搜索我的桌面会导致程序崩溃。我认为这与递归和最终的堆栈大小有关,我想在可能的情况下实现更优雅的解决方案(我已经阅读了关于trampolining但我不是100%肯定会解决这个问题)。
答案 0 :(得分:2)
您可以使用Queue
并按照以下方式开展工作:
class ImageSearcher
{
private Queue<DirectoryInfo> found = new Queue<...>();
public void ImageSearchByDir(DirectoryInfo dir)
{
found.Enqueue(dir);
RealSearch();
}
private void RealSearch()
{
while(found.Count > 0)
{
var current = found.Dequeue()
// do your filtering on the current folder
// then add the children directories
foreach(dir in current.GetDirectories())
{
found.Enqueue(dir);
}
}
}
}
这样你就不会有递归,如果这是你认为困扰你的那些