1

因此,我正在尝试遍历硬盘驱动器上的每个文件,但是一旦到达第 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

4 回答 4

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);
}
于 2012-06-05T21:20:33.620 回答
0

通过使用列表 (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();
        }

    }

}
于 2012-06-05T21:33:38.273 回答
0

将此重载SearchOption.AllDirectories一起使用,因此您不必进行任何递归:

public static string[] GetDirectories(
    string path,
    string searchPattern,
    SearchOption searchOption
)
于 2012-06-05T21:21:36.193 回答
0

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

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

于 2012-06-05T21:24:47.570 回答