2013-02-06 35 views
2

我希望獲取其中包含特定文件的所有文件夾/目錄的列表。我如何使用C#代碼執行此操作。如何使用c獲取包含特定文件的目錄列表

例如:考慮我有20個文件夾,其中7個文件夾中有一個名爲「abc.txt」的文件。我想知道所有具有文件「abc.txt」的文件夾。

我知道我們可以通過查看路徑中的所有文件夾以及每次檢查File.Exists(filename);但我想知道是否有其他方式做同樣的事情,而不是遍歷所有的文件夾(這可能會消耗很少的時間,當有很多文件夾)。

感謝
-Nayan

+0

你必須這樣做遞歸據我所知,我很害怕。 – Derek

回答

8

我會使用目錄類的方法EnumerateFiles用的搜索模式和SearchOption包括AllDirectories。這將返回與模式匹配的所有文件(包括目錄的完整文件名)。

使用Path類可以獲得文件的目錄。

string rootDirectory = //your root directory; 
var foundFiles = Directory.EnumerateFiles(rootDirectory , "abc.txt", SearchOption.AllDirectories); 

foreach (var file in foundFiles){ 
    Console.WriteLine(System.IO.Path.GetDirectoryName(file)); 
} 

EnumerateFiles只能因爲.NET框架4如果您正在使用舊版本的.NET框架的工作,那麼你可以使用目錄類的GetFiles

更新(請參閱從PLB評論):

如果拒絕的訪問到一個目錄上面的代碼將失敗。在這種情況下,您將需要一個接一個地搜索每個目錄以處理異常。

public static void SearchFilesRecursivAndPrintOut(string root, string pattern) 
{ 
    //Console.WriteLine(root); 
    try 
    { 
     var childDireactory = Directory.EnumerateDirectories(root); 
     var files = Directory.EnumerateFiles(root, pattern); 

     foreach (var file in files) 
     { 
      Console.WriteLine(System.IO.Path.GetDirectoryName(file)); 
     } 

     foreach (var dir in childDireactory) 
     { 
      SearchRecursiv(dir, pattern); 
     } 
    } 
    catch (Exception exception) 
    { 
     Console.WriteLine(exception); 
    } 
} 
+4

這個問題的一個缺點是,如果至少有一個子文件夾不可訪問,它將拋出'UnauthorizedAccessException'。 – Leri

+0

@PLB:謝謝你的提示。 – Jehof

+0

@Jehof - 這種方法不起作用..我也試過相同.. EnumerateFiles返回空列表:(我正在使用.NET 4 –

0

下面介紹如何縮小按特定標準搜索(即只包括含有「微軟」,「IBM」或「NHibernate的」在其名稱中的DLL)。

var filez = Directory.EnumerateFiles(@"c:\MLBWRT", "*.dll", SearchOption.AllDirectories) 
     .Where(
      s => s.ToLower().Contains("microsoft") 
      && s.ToLower().Contains("ibm") 
      && s.ToLower().Contains("nhibernate")); 
string[] allFiles = filez.ToArray<string>(); 
for (int i = 0; i < allFiles.Length; i++) { 
    FileInfo fInfo = new FileInfo(allFiles[i]); 
    Console.WriteLine(fInfo.Name); 
} 
+0

你應該使用'EnumerateFiles'來爲你的搜索添加一個where子句,同時這將查找包含「microsoft」,「ibm」和「nhibernate」的文件,你可能想要改變它。 – Eluvatar

相關問題