2012-12-18 79 views
0

我寫了一個方法,需要找到路徑中的所有文件,並且我想使用遞歸獲取所有文件。這是我目前的方法:獲取路徑內的所有文件(遞歸)

public void doStart(DirectoryInfo dir, string filePattern) 
     { 
      try 
      { 
       foreach (FileInfo fileInfo in dir.GetFiles(filePattern)) 
       { 
        if (fileFound != null) 
        { 
         fileFound(fileInfo); 
        } 
       } 
      } 
      catch (Exception) 
      { 

      } 

      try 
      { 
       foreach (DirectoryInfo dirInfo in dir.GetDirectories()) 
       { 
        doStart(dirInfo, filePattern); 
       } 
      } 
      catch (Exception) 
      { 

      } 
     } 

     public void Start(string path, string filePattern) 
     { 
      doStart(new DirectoryInfo(path), filePattern); 
     } 

是否有更好的方法來寫這種遞歸或者是否足夠好?

回答

7

嘗試這樣:

string[] filePaths = Directory.GetFiles(@dir, "*.filetype", SearchOption.AllDirectories); 

這將通過目錄遞歸看,發現有一定的文件類型(「.filetype」)中的所有文件,並返回一個包含所有找到的文件的字符串數組。

此外,我建議不要使用空的catch塊,因爲如果出現問題,應用程序不會讓您知道。可以顯示一個消息框(或類似的東西)或將其記錄到數據庫或其他東西。

此外,如果子目錄中存在子目錄,您的DoStart()方法會做什麼?從我所看到的情況來看,我只能說它只搜索1層樓。

+0

的代碼搜索在此代碼的所有子目錄:'的foreach(DirectoryInfo的dirInfo在dir.GetDirectories()){ DOSTART (dirInfo,filePattern); } –

+0

@NikolaDavidovic根據MSDN,它沒有(http://msdn.microsoft.com/en-us/library/s7xk2b58.aspx),它只獲取當前目錄的子目錄。 – Stefan

+0

啊,現在我看到了遞歸。沒關係。 :) – Stefan

1
  1. 不要吞下所有例外。如果您需要忽略特定的例外,趕上那些而是讓別人泡了
  2. (風格)的方法應該PascalCased(如DoStart和'的FileFound」
  3. (風格)創建OnFileFound方法,而不是直接調用FileFound(我假設fileFound是事件處理程序?)

除此之外,它看起來好像沒什麼問題。

0

這裏是真正的遞歸的例子。這將搜索,直到沒有更多的子目錄找到,不像目錄.GetFiles SearchOption.AllDirectori ES。您可以修改它以添加搜索過濾器作爲參數。

public IEnumerable<string> GetFilesRecursive(string ParentDirectory) 
{ 
    string[] subDirectories = Directory.GetDirectories(ParentDirectory); 
    foreach (string file in Directory.GetFiles(ParentDirectory)) 
    { 
     yield return file; 
    } 

    foreach (string subDirectory in subDirectories) 
    { 
     foreach (string file in GetFilesRecursive(subDirectory)) 
     { 
      yield return file; 
     } 
    } 
} 
相關問題