Переполнение стека при рекурсии - C#

Узнай цену своей работы

Формулировка задачи:

Есть такая задача: составить полный список всех папок на сервере. Делаю так
static List<string> FolderList = new List<string>();
static void Selection(DirectoryInfo dir)
        {
                //добавляем каталог в список каталогов
                FolderList.Add(dir.FullName);
                // проходим по всем поддиректориям
                foreach (var a_dir in dir.GetDirectories())
                {
                    Selection(a_dir);
                }
        }
Все хорошо, но примерно на 65000 папке возникает исключение StackOverFlowException. Самих папок больше миллиона, есть идеи как все красиво сделать? Может вместо списка использовать какую нибудь другую коллекцию. Хотелось бы оставить рекурсию, уж очень с ней код красивый.

Решение задачи: «Переполнение стека при рекурсии»

textual
Листинг программы
static List<string> FolderList = new List<string>();
internal static void Selection(DirectoryInfo dir)
{
    var stack = new Stack<DirectoryInfo>();
    stack.Push(dir);
 
    while (stack.Count > 0)
    {
        dir = stack.Pop();
 
        FolderList.Add(dir.FullName);
        Console.WriteLine(dir.FullName);
        Console.Title = stack.Count.ToString();
        try
        {
            foreach (var a_dir in dir.GetDirectories())
            {
                        
                Console.Title = stack.Count.ToString();
                stack.Push(a_dir);
            }
        }
        catch (Exception)
        { }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы