我個人覺得很難避免遞歸。因爲文件系統沒有被索引。 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);
}
遞歸地瀏覽兩個硬盤上的所有文件不會比第一個方法更快。基本上,如果你有路徑和文件名,你可以做兩個簡單的檢查,看看它們是否存在,並且根本不需要任何遞歸循環。 – 2013-04-08 13:01:59
@JohnWillemse,我不知道整個路徑,只是它的一部分。 TestRoot可能位於任何地方。但是我可以將深度限制爲某個數字,例如10。或者排除某些系統文件夾。這對我的任務是可以接受的 – 2013-04-08 13:05:47
在這種情況下,您可以在他的回答中接受Jim Mischel的建議,以獲取目錄和/或其子目錄中的文件。 – 2013-04-08 13:07:36