2016-07-09 31 views
-1

Ich mache eine vollständige Liste der Ordner auf dem Server, aber etwa 65.000 StackOverFlowException teilen, gibt es eine Ausnahme. wie man kommtC# Stack-Überlauffehler mit Rekursion

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

enthalten Wenn Sie Ihre Frage stellten, gab es eine große orange ** So formatieren Sie das Feld ** rechts neben dem Textbereich mit nützlichen Informationen. Es gab auch eine komplette Symbolleiste mit Formatierungshilfen. Und eine ** [?] ** -Taste mit Formatierungshilfe. * Und * einen Vorschaubereich zwischen dem Textbereich und dem Post Your Question-Button (so dass Sie darüber scrollen müssen, um den Button zu finden, um Sie dazu anzuregen, ihn anzuschauen) und zeigen, wie Ihr Beitrag aussehen würde, wenn er gepostet wird . Wenn Sie Ihren Beitrag klarstellen und zeigen, dass Sie sich die Zeit genommen haben, verbessern Sie Ihre Chancen, gute Antworten zu erhalten. –

+2

(Ich habe es bei dieser Gelegenheit für Sie behoben.) –

+2

Schritt durch den Code mit dem Debugger. Es ist viel schneller und informativer, als Fremde zu fragen, was mit dem Code nicht stimmt. –

Antwort

1

Es ist keine gute Methode, Rekursion zu verwenden, wenn Sie unbekannte Tiefe haben. Alternativ können Sie die Überlastung für GetDirectories verwenden (die eine Stapel-Datenstruktur verwendet und nicht die Rekursion):

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); 
    } 
} 

Wenn Sie immer noch eine Ausnahme auftreten, müssen Sie Ihre Logik zu einem traditionellen while-Schleife ändern.

Text & Tabellen unten für GetDirectories:

search:

Der Suchbegriff mit den Namen von Verzeichnisse entsprechen. Dieser Parameter kann eine Kombination aus gültigem Literal Pfad- und Platzhalterzeichen (* und?) Enthalten (siehe Anmerkungen), unterstützt jedoch keine regulären Ausdrücke ( ). Das Standardmuster ist "*", das alle Dateien zurückgibt.

Search:

Einer der Enumerationswerte, ob die Operation Suche spezifiziert> sollte nur das aktuelle Verzeichnis oder alle Unterverzeichnisse

+0

Ist das rekursiv (d. H. Gibt alle Unterordner in Unterordnern zurück)? –

+0

@YosiDahari Ich habe die Implementierung überprüft, sie verwendet intern einen Stack und keine rekursive Funktion. – user3185569

+0

@YosiDahari bedeutet zu fragen, ob die Methode * alle * Ordner zurückgibt, einschließlich Ordner in Ordnern innerhalb von Ordnern und so weiter? – EvilTak