所以我试图浏览硬盘上的每个文件,但是一旦到达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!");
}
}
}
}
}
答案 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 overload与SearchOption.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();
}
}
}