什麼是在C#中以編程方式搜索文件的最快方式。我知道該文件的相對位置,可以說它的"abcd\efgh\test.txt".
我也知道這個文件在我的E:\ drive
上。 「abcd」是E:\驅動器中某個目錄的子目錄。用C搜索文件#
感謝
什麼是在C#中以編程方式搜索文件的最快方式。我知道該文件的相對位置,可以說它的"abcd\efgh\test.txt".
我也知道這個文件在我的E:\ drive
上。 「abcd」是E:\驅動器中某個目錄的子目錄。用C搜索文件#
感謝
既然你知道你要搜索根目錄和文件名字符串模式,你可以創建一個DirectoryInfo與根目錄:
DirectoryInfo dir = new DirectoryInfo(@"E:\");
然後調用GetFiles()
讓所有的比賽。通過SearchOption.AllDirectories
將確保搜索是遞歸的。
List<FileInfo> matches =
new List<FileInfo>(dir.GetFiles(partialFilename,
SearchOption.AllDirectories));
或者,如果你知道路徑(而不是文件名)的一部分:
List<DirectoryInfo> matches =
new List<DirectoryInfo>(dir.GetDirectories(partialDirectoryName,
SearchOption.AllDirectories));
然後你就可以從那裏導航到該文件。
所以,如果我理解正確的話,你知道的路徑將是下面的形式:
"E:\\" + something + "\\abcd\\efgh\\test.txt"
如果something
是隻有1級深,然後簡單地得到您的電子所有目錄:和然後嘗試在每個子目錄上打開一個文件。
如果something
的深度超過1級,則執行遞歸調用以獲取目錄,直至找到abcd
。
最快的方式很可能是使用FindFirstFile
等API,但我本來以爲你能做到這一點相當迅速與Directory.GetDirectories
(找到合適的子direcotry),然後Directory.GetFiles
(和容易得多)找到實際的文件。
只需使用File.Exists方法並遍歷所有可能的文件名。也許是這樣的(未測試):
string SearchInFolder(string root) {
if (File.Exists(Path.Append(root, "\\abcd\\efgh\\test.txt")) return Path.Append(root, "\\abcd\\efgh\\test.txt");
foreach(var folder in Directory.GetDirectories(root)) {
var fullFile = Path.Append(folder, "\\abcd\\efgh\\test.txt");
if (File.Exists(fullFile)) {
// Found it !!!!
return fullFile;
} else {
var result = SearchInFolder(folder);
if (result != null) return result;
}
}
return null;
}
但是,這將SEACH整個E:\驅動器的模式,子文件夾也被搜索。
我認爲該算法將從e:\開始,並讀取所有目錄。如果其中一個是\ abcd \,請立即檢查路徑和文件的其餘部分,例如efgh \ test.txt。
如果e:\沒有\ abcd \,那麼您需要遍歷每個子目錄並執行相同的檢查。 \ abcd \存在嗎?是的,請檢查efgh \ text.txt。沒有?遍歷子節點。
如果你需要絕對最快的,當你找不到\ abcd \,並且你有你的子目錄列表你現在必須去檢查,你可以引入一些線程級別。但這可能會很快就會變得毛茸茸的。
nit:C#沒有文件I/O方法。您將使用.NET搜索文件,並且只能用C#編寫代碼。因此,您最好告訴我們您將使用哪種.NET Framework版本,以及您將使用哪種C#版本。例如,你可能在C#3.0中使用.NET 2.0。 – 2010-06-23 15:01:10
是的,我使用.NET 2.0與C#3.0 – dsilva 2010-06-23 15:11:14