递归循环文件会突然停止

时间:2012-06-05 21:16:04

标签: c# recursion stack-overflow callstack

所以我试图浏览硬盘上的每个文件,但是一旦到达2115(我认为)循环就会停止。由于我使用了递归,我相信这是一个堆栈溢出,但我是C#的新手并且真的不知道。这是我的代码,非常感谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;

namespace test_data
{
    class Program
    {
        static string drive = Path.GetPathRoot(Environment.CurrentDirectory);

        static void CrawlDir(string dir)
        {
            string[] dir_package = {};
            List<string> dir_list = new List<string>();
            foreach (string scan_dir in Directory.GetDirectories(dir))
            {

                try
                {
                    dir_list.Add(scan_dir);
                }
                catch (System.Exception error)
                {
                    Console.WriteLine(error.Message);
                }

            }

            dir_package = dir_list.ToArray();
            Process_Package(dir_package);
        }

        static void Main(string[] args)
        {
            CrawlDir(drive);
            Console.ReadLine();
        }

        static void Process_Package(string[] package)
        {
            foreach (string dir in package)
            {
                Console.WriteLine(dir);
                try
                {
                    CrawlDir(dir);
                }
                catch (Exception)
                {
                    Console.WriteLine("Error!");
                }
            }
        }

    }

}

4 个答案:

答案 0 :(得分:2)

只需使用内置的内容 - Directory.GetDirectories支持可选参数,以指定是否要递归获取所有目录:

var dirs = Directory.GetDirectories(drive, "*.*", SearchOption.AllDirectories);

请注意,这是一个阻止调用 - 相反,您可以使用Directory.EnumerateDirectories逐个接收目录名称:

var dirs = Directory.EnumerateDirectories(drive, "*.*", SearchOption.AllDirectories);
foreach(string dir in dirs)
{
   Console.WriteLine(dir);
}

答案 1 :(得分:0)

this overloadSearchOption.AllDirectories一起使用,这样您就不必进行任何递归了:

public static string[] GetDirectories(
    string path,
    string searchPattern,
    SearchOption searchOption
)

答案 2 :(得分:0)

递归看起来或多或少都没问题,尽管你真的不需要CrawlDir中的列表。如果你有一个堆栈溢出,你会得到一个讨厌的消息。

我的猜测是 - 程序完成并在ReadLine()处停止,等待您按Enter键。

答案 3 :(得分:0)

通过使用List(dir_list),数组(dir_package)和两个try / catch循环,您为每个递归级别添加了大量开销。我不知道你真正要做的是什么,但是对于这个例子来说这有点过头了。

但是,在现代操作系统上导致堆栈溢出会花费很多。您收到了什么错误消息?

此代码应该是等效的。

using System;
using System.IO;

namespace test_data
{
    class Program
    {
        static string drive = Path.GetPathRoot(Environment.CurrentDirectory);

        static void CrawlDir(string dir)
        {
            foreach (string subDir in Directory.GetDirectories(dir))
            {
                try
                {
                    Console.WriteLine(subDir);
                    CrawlDir(subDir);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

        static void Main(string[] args)
        {
            CrawlDir(drive);
            Console.ReadLine();
        }

    }

}