[.NET]Directory.GetFiles以searchPattern * 會找到非預期的檔名!?

用Directory.GetFiles要找出S588*.TIF的檔案,卻會找出不只有S588開頭的檔案?
到底是那裡的問題呢?

最近在論壇上有看到「C# Directory.GetFiles 問題」,Joe網友用Directory.GetFiles要找出S588*.TIF的檔案,卻會找出不只有S588開頭的檔案!

後來發現是因為8.3檔名在搞鬼,(MSDN的注意事項:由於這個方法會檢查具有 8.3 檔案名稱格式及長檔名格式的檔案名稱,所以類似於 "*1*.txt" 的搜尋模式可能會傳回未預期的檔案名稱。 例如,使用 "*1*.txt" 的搜尋模式會傳回 "longfilename.txt",因為對等的 8.3 檔案名稱格式為 "LONGFI~1.TXT"。)。

將8.3檔名停用就不會有這種問題發生了! 如何停用 8.3 名稱可參考以下的文章,

如何停用 NTFS 磁碟分割上的 8.3 名稱建立

NtfsDisable8dot3NameCreation

 

其實如果是IIS的話,也建議停用 8.3 名稱,記得在一個客戶那有被掃到說,IIS沒有將 8.3 名稱停用,可能會有資安的問題哦!

詳細可參考:Windows Short (8.3) Filenames – A Security Nightmare?

當然,如果無法停用的話,那只好在透過 Directory.GetFiles 取得資料後,再進行一次的Filter,如下,

var files = Directory.GetFiles("", "S588*.TIF").Where(item => item.StartWith("S588"));

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^