2012-05-21 72 views
3

我正在編寫一個軟件工具,作爲其主要任務的一部分,必須在目錄及其子目錄中搜索具有給定名稱的目錄,並將保存到字符串數組的每個文件路徑終止與指定的目錄名稱。例如:c#使用目錄類搜索

 
        level_1  level_2  Level_3 
RootDirectory ---> folderA ---> folderD ---> FolderF ---> Target 
      |   |---> folderE ---> Target 
      |    
      |---> folderB ---> Target 
      | 
      |---> FolderC ---> Target 

應該泵出:

string[] = {RootDirectory\folderA\FolderD\folderF\Target, 
    RootDirectory\folderA\folderE\Target, 
    Rootdirectory\folderB\Target, 
    RootDirectory\foderC\Target} 

本來我的目錄信息對象所使用getDirectories(myPath, "Target", SearchOption.AllDirectories),但有一個問題。出於某種原因,它會在文件夾b和c下以及folderA> folderD> folderF下找到目標,但會跳過FolderE。一旦它在子目錄folderA中找到第一個匹配項,它就會進入level_1的下一個文件夾。我應該提到我實際情況下的folderD實際上是在folderE之前按字母順序排序的,因爲它在本例中是

所以我決定使用IEnumerator並運行where過濾器來選擇以給定目錄名稱。這找到了他們。但是,我無法弄清楚如何在IEnumerator上做類似getDirectories().Where(x=>(x.attributes & fileattributes.hidden)==0);的事情。

問題是,我需要它跳過隱藏的SVN目錄,因爲它顯着減慢了過程。

所以,這裏是我的問題: 我怎樣才能得到一個子目錄內以給定的目錄名結尾的所有路徑的集合,並從搜索中排除隱藏的文件?

回答

0

我認爲你將不得不寫自己的實現。如果你是在.NET 4.0中,你可以使用EnumerateDirectories

,做這樣的事情:

private IEnumerable<DirectoryInfo> EnumerateDirectories(DirectoryInfo dir, string target) 
{ 
    foreach (var di in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly)) 
    { 
     if ((di.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden) 
     { 
      if (di.Name.EndsWith(target, StringComparison.OrdinalIgnoreCase)) 
      { 
       yield return di; 
       continue; 
      } 
      foreach (var subDir in EnumerateDirectories(di, target)) 
      { 
       yield return subDir; 
      } 
     } 
    } 
} 

然後:

DirectoryInfo dir = new DirectoryInfo(@"C:\RootDirectory"); 
var found = EnumerateDirectories(dir,"target").ToArray(); 

這樣,一旦你要麼找到一個 「目標」,或者運行到一個隱藏的目錄,你不再需要通過子目錄。

+0

感謝您的迴應!這工作就像一個魅力,並且變得更快!編輯:我剛剛發現,這跳過了兩個目錄....我在調試過程中找出原因。 –

+0

跳過兩個目錄? ... 1)它們位於隱藏目錄中,或者2)它們不會以您發送的目標結束......我看不到任何其他原因,任何子目錄都會被跳過......也許您打算做一個簡單包含目標的搜索? –

+0

哦......有第三種可能性,你嵌套了目標目錄...在這種情況下,刪除繼續(這段代碼將停止向下目錄樹一旦找到目標 –

1

我在我的C:\的根目錄中創建了您的文件夾結構,並使用Linqpad提出了以下代碼。

string root = "c:\\folderA"; 
string target = "Target"; 
var d = new DirectoryInfo(root); 
var x = d.EnumerateDirectories(target, SearchOption.AllDirectories); 
x.ToList() // for each element, it's in the the FullName 

只有一部分缺少的是忽視了.svn文件夾