2012-06-05 36 views
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!"); 
       } 
      } 
     } 

    } 

} 
+0

您可能會在您嘗試訪問的其中一個子目錄中收到訪問被拒絕錯誤。嘗試查看Process_Package方法中的Catch語句中的異常,以查看發生錯誤的實際錯誤。 – TLiebe

+0

@TimeSchmelter:不,遞歸只要Directory.GetDirectories()不返回結果就會暫停。 – Odrade

回答

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

遞歸看起來或多或少正常,雖然你並不真的需要在CrawlDir列表。如果你有一個堆棧溢出,你會得到一個令人討厭的消息。

我的猜測是 - 程序完成並停在ReadLine()等待您按Enter鍵。

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

    } 

} 
+0

感謝所有的幫助,夥計們。我只是將其作爲測試練習。 – user1438378