2010-06-23 41 views
2

什麼是在C#中以編程方式搜索文件的最快方式。我知道該文件的相對位置,可以說它的"abcd\efgh\test.txt".我也知道這個文件在我的E:\ drive上。 「abcd」是E:\驅動器中某個目錄的子目錄。用C搜索文件#

感謝

+0

nit:C#沒有文件I/O方法。您將使用.NET搜索文件,並且只能用C#編寫代碼。因此,您最好告訴我們您將使用哪種.NET Framework版本,以及您將使用哪種C#版本。例如,你可能在C#3.0中使用.NET 2.0。 – 2010-06-23 15:01:10

+0

是的,我使用.NET 2.0與C#3.0 – dsilva 2010-06-23 15:11:14

回答

2

既然你知道你要搜索根目錄和文件名字符串模式,你可以創建一個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)); 

然後你就可以從那裏導航到該文件。

0

所以,如果我理解正確的話,你知道的路徑將是下面的形式:

"E:\\" + something + "\\abcd\\efgh\\test.txt" 

如果something是隻有1級深,然後簡單地得到您的電子所有目錄:和然後嘗試在每個子目錄上打開一個文件。

如果something的深度超過1級,則執行遞歸調用以獲取目錄,直至找到abcd

0

最快的方式很可能是使用FindFirstFile等API,但我本來以爲你能做到這一點相當迅速與Directory.GetDirectories(找到合適的子direcotry),然後Directory.GetFiles(和容易得多)找到實際的文件。

0

只需使用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:\驅動器的模式,子文件夾也被搜索。

0

我認爲該算法將從e:\開始,並讀取所有目錄。如果其中一個是\ abcd \,請立即檢查路徑和文件的其餘部分,例如efgh \ test.txt。

如果e:\沒有\ abcd \,那麼您需要遍歷每個子目錄並執行相同的檢查。 \ abcd \存在嗎?是的,請檢查efgh \ text.txt。沒有?遍歷子節點。

如果你需要絕對最快的,當你找不到\ abcd \,並且你有你的子目錄列表你現在必須去檢查,你可以引入一些線程級別。但這可能會很快就會變得毛茸茸的。