文件操作中尾递归的问题(C#)

时间:2016-08-11 20:55:57

标签: c# file recursion directory stack-overflow

我正在编写一个程序来查找计算机上所有类型的文件(当前是图像文件),并且我正在使用尾递归以这种方式搜索目录:

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%肯定会解决这个问题)。

1 个答案:

答案 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);
             }
         }  
    }
}

这样你就不会有递归,如果这是你认为困扰你的那些