2013-04-08 42 views
0

我想查找位於TestRoot\TestSubFoler\Test\之內的名稱爲TestName.lol的系統中的所有文件。查找系統中位於文件夾定義層次結構內的所有文件

I.e.如果有TestRoot\TestSubFoler\Test\TestName.lol都在磁盤上CD,那麼我想獲得2個文件。

我認爲不同的方式來做到這一點:

  1. 開始與C:\D:\然後遞歸搜索TestRoot。然後對所有發現的事件做相同的事情,而不是C:\D:\。等等。

  2. 以遞歸方式搜索TestName.lol的所有文件夾。然後過濾出位於「錯誤」文件夾中的文件。 (我相信在我的情況下,這將會更快,因爲這種文件的估計數量並不大:1-10)

  3. ???我相信這可以有更好的方式(更優雅或更好的表現)。無論如何,如果你認爲我的解決方案是好的,只需確認請。

謝謝。

編輯: Search file in directory using complex pattern一個類似的問題。

+0

遞歸地瀏覽兩個硬盤上的所有文件不會比第一個方法更快。基本上,如果你有路徑和文件名,你可以做兩個簡單的檢查,看看它們是否存在,並且根本不需要任何遞歸循環。 – 2013-04-08 13:01:59

+0

@JohnWillemse,我不知道整個路徑,只是它的一部分。 TestRoot可能位於任何地方。但是我可以將深度限制爲某個數字,例如10。或者排除某些系統文件夾。這對我的任務是可以接受的 – 2013-04-08 13:05:47

+0

在這種情況下,您可以在他的回答中接受Jim Mischel的建議,以獲取目錄和/或其子目錄中的文件。 – 2013-04-08 13:07:36

回答

1

我個人覺得很難避免遞歸。因爲文件系統沒有被索引。 Google桌面或Microsoft桌面搜索將所有文件編入索引。如果你查詢,你會很快得到答案。

我們的選擇是.net框架爲您遞歸或您自己做。

其他選項是Linq - 我猜.net框架會做遞歸。但是這將是清潔

的LINQ

http://msdn.microsoft.com/en-us/library/bb882649.aspx

// Take a snapshot of the file system. 
     System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(startFolder); 

     // This method assumes that the application has discovery permissions 
     // for all folders under the specified path. 
     IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories); 

     string searchTerm = @"Visual Studio"; 

     // Search the contents of each file. 
     // A regular expression created with the RegEx class 
     // could be used instead of the Contains method. 
     // queryMatchingFiles is an IEnumerable<string>. 
     var queryMatchingFiles = 
      from file in fileList 
      where file.Extension == ".htm" 
      let fileText = GetFileText(file.FullName) 
      where fileText.Contains(searchTerm) 
      select file.FullName; 

     // Execute the query. 
     Console.WriteLine("The term \"{0}\" was found in:", searchTerm); 
     foreach (string filename in queryMatchingFiles) 
     { 
      Console.WriteLine(filename); 
     } 

。網絡代碼

foreach (FileInfo fi in directory.GetFiles()) 
{ 
    // Console.WriteLine(@"Found file: [{0}] in directory: [{1}]", fi.Name, directory.FullName); 

} 
foreach (DirectoryInfo diSourceSubDir in directory.GetDirectories()) 
{ 
    // Console.WriteLine(@"Sub Folder {0} found.", diSourceSubDir.FullName); 
} 
1

看看Directory.GetFiles方法。這應該做你想做的。

其實,this overload可能是你需要的。

或者,你可以打電話Directory.EnumeratFiles,它會爲你做遞歸。

您的選擇#2可能是要走的路。

確實沒有一個特別有效的方法來做到這一點。您可以通過直接調用Windows的API函數FindFirstFindNext來加快它的速度,但除非您經常這麼做,否則它不值得付出努力。

相關問題