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、ディレクトリ名が見つかったときに 1 つずつ受け取るために使用できます。

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)、および 2 つの try/catch ループを使用して、再帰の各レベルに多くのオーバーヘッドを追加しています。あなたが本当に何をしようとしているのかはわかりませんが、この例ではやり過ぎです。

それでも、最新の OS でスタック オーバーフローを引き起こすには、かなりの時間がかかります。どのようなエラー メッセージが表示されますか?

このコードは同等である必要があります。

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

CrawlDir のリストは実際には必要ありませんが、再帰は多かれ少なかれ問題ないように見えます。スタック オーバーフローが発生すると、厄介なメッセージが表示されます。

私の推測では、プログラムが完了し、Enter が押されるのを待っている ReadLine() で停止します。

于 2012-06-05T21:24:47.570 に答える
0

このオーバーロードSearchOption.AllDirectoriesで使用すると、再帰を行う必要がなくなります。

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