1 MSDN上關於DirectoryInfo.GetFiles()搜尋模式的說明
先看關於DirectoryInfo.GetFiles()的MSDN文檔:
public FileInfo[] GetFiles( string searchPattern, SearchOption searchOption)
在 searchPattern 中使用星號萬用字元時(例如,“*.txt”),匹配行為會根據指定副檔名的長度而有所不同。副檔名正好是三個字元的searchPattern 將返回副檔名為三個或更多字元的檔案,其中前三個字元與searchPattern 中指定的副檔名匹配。副檔名為一個、兩個或三個以上字元的 searchPattern 僅返回副檔名長度正好與searchPattern 中指定的副檔名匹配的檔案。使用問號萬用字元字元時,此方法僅返回與指定副檔名匹配的檔案。例如,假設目錄下有兩個檔案“file1.txt”和“file1.txtother”,使用“file?.txt”搜尋模式時只返回第一個檔案,而使用“file*.txt”搜尋模式時會同時返回這兩個檔案。 |
以下列表顯示了 searchPattern 參數的不同長度的行為:
“*.abc”返回副檔名為 .abc、.abcd、.abcde、.abcdef 等的檔案。
“*.abcd”只返回副檔名為 .abcd 的檔案。
“*.abcde”只返回副檔名為 .abcde 的檔案。
“*.abcdef”只返回副檔名為 .abcdef 的檔案。
2 實際執行測試
然後執行如下測試代碼:
using System;using System.IO;namespace ConsoleApplication2{ class Program { static void Main(string[] args) { DirectoryInfo di = new DirectoryInfo(@"F:\test"); DirectoryInfo di2 = new DirectoryInfo(@"Y:\test"); FileInfo[] fis = di.GetFiles("*.doc", SearchOption.AllDirectories); FileInfo[] fis2 = di2.GetFiles("*.doc", SearchOption.AllDirectories); Console.WriteLine("位於本地硬碟上的檔案夾"); foreach (FileInfo fi in fis) { Console.WriteLine(fi.Name); } Console.WriteLine("位於SAMBA伺服器上的檔案夾"); foreach (FileInfo fi in fis2) { Console.WriteLine(fi.Name); } } }}
註:代碼中的兩個檔案夾"F:\test"與"Y:\test"是內容完全一樣的,其中Y是一個映射分區,內容實際是一台samba伺服器共用的檔案夾,裡面是一些Word文檔,內容如下:
再看看程式的運行結果:
3 測試結果分析
可見,如果是本地硬碟,那麼確實如MSDN所說,*.doc既會匹配.doc也會匹配.docx文檔。但是如果目錄所在地不是本地硬碟(本例是Linux上的samba共用),那麼就只會匹配.doc而不會匹配.docx。
這也說明了MSDN的說法不夠準確,至少不全面。希望對大家有所協助。