2016-07-09 4 views
-1

私はサーバー上のフォルダの完全なリストを行いますが、約65,000のStackOverFlowException共有は例外です。どのように回避するか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); 
    } 
} 
+2

、あなたの質問をした含めるかどうかを指定する列挙値の

一つ、**大きなオレンジがありましたどのように書式を設定する**ボックスにテキストエリアの右側に有益な情報を入れてください。また、書式設定支援ツールバー全体がありました。 ** [?] **ボタンを押すと書式設定のヘルプが表示されます。 *また、テキストエリアと投稿の質問ボタンの間にあるプレビューエリア(ボタンを見つけるために過去にスクロールする必要があるため、あなたがそれを見てみることを推奨します) 。あなたの投稿をはっきりさせ、時間を割いていることを実証することで、良い答えを得る機会が増えます。 –

+2

(私はこの機会にあなたのために修正しました) –

+2

デバッガを使用してコードをステップ実行します。見知らぬ人にコードに何が問題なのかを尋ねるよりもはるかに高速で有益です。 –

答えて

1

未知の深さがある場合は再帰を使用することはお勧めできません。また、あなたは(スタックデータ構造を使用し、再帰ない)GetDirectoriesためのオーバーロードを使用することができます:あなたはまだ例外が発生した場合

static List<string> FolderList = new List<string>(); 
static void Selection(DirectoryInfo dir) 
{ 
    var dirs = dir.GetDirectories("*", SearchOption.AllDirectories); 
    foreach (var a_dir in dirs) 
    { 
     FolderList.Add(dir.FullName); 
    } 
} 

を、あなたがループしながら、伝統的に、あなたのロジックを変更する必要があります。 GetDirectoriesについては、以下の

ドキュメント:

のsearchPattern: ディレクトリの名前と照合する

検索文字列。このパラメータには、有効なリテラル のパスとワイルドカード(*と?)の文字(備考参照)の組み合わせを含めることはできますが、正規表現は には対応していません。デフォルトパターンは "*"で、 すべてのファイルが返されます。

はsearchOption

:検索操作>は現在のディレクトリのみ、またはすべてのサブディレクトリ

+0

これは再帰的ですか(つまり、サブフォルダ内のすべてのサブフォルダを返しますか? –

+0

@ YosiDahari実装をチェックしたところ、内部的にスタックを使用し、再帰関数は使用しません。 – user3185569

+0

@ YosiDahariは、メソッドがフォルダ内のフォルダ内のフォルダを含む* all *フォルダを返すかどうかを尋ねることを意味しますか? – EvilTak