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

本文关键字:问题 递归 操作 尾部 文件 | 更新日期: 2023-09-27 18:02:07

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

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个文件夹下,没有问题,但试图搜索我的桌面时,程序崩溃了。我认为这与递归和由此产生的堆栈大小有关,如果可能的话,我想实现一个更优雅的解决方案(我已经阅读了trampolining,但我不能100%确定这会解决这个问题)。

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

您可以使用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);
             }
         }  
    }
}

这样就没有递归了,如果你觉得这很麻烦