2012-01-10 60 views
6

我最近碰到了一個奇怪的功能從微軟古怪的功能:在.NET中的Directory.GetFiles()時,搜索模式包含3個字符的擴展

假設我們的文件夾c:\tmp123包含3個文件 -
1.txt
2.txtx
3.txtxt

a)調用Directory.GetFiles(@"C:\tmp123", "*.txt")在3個返回的項目中產生。
b)調用Directory.GetFiles(@"C:\tmp123", "*.txtx")在1個返回的項目中產出。

根據Microsoft的說法,這是預期的行爲(請參閱MSDN中的說明)。

我的問題是:

  1. 爲什麼微軟決定有這樣一個奇怪的功能?

  2. 我該如何克服這個問題?
    即我如何擁有一個搜索模式,只返回*.txt擴展名而不返回*.txtx,*.txtstarngefunctionality等?

回答

0

我願意下注,這與向後兼容性有關。我沒有看到提到這個確切問題,但this Raymond Chen blogpost提到了在這方面的一些奇怪的現象:

[...]的FCB匹配算法的一些怪癖持續到Win32的,因爲 他們已經成爲成語。

例如,如果您的模式以.*結尾,則會忽略 .*。如果沒有這個規則,*.*模式只會匹配 包含一個點的文件,因爲 每個運行Windows NT 3.1的用戶都會在這個星球上長大,因此這個文件可能會破壞地球上所有批處理文件的90%以及所有人的肌肉內存。一個世界*.*意思是 所有文件。作爲另一個例子,以點結尾的圖案實際上並不以點結尾的匹配文件;它匹配沒有擴展名的文件。 如果一個問號在點之前立即出現 ,則問號可以匹配零個字符。

2

原因是向後兼容。

Windows最初是作爲MSDOS上的圖形界面構建的,它只有名稱爲8個字符,擴展名最多爲3個的文件。對MSDOS文件系統的擴展允許Windows具有更長的文件名和擴展名,但這些文件名仍會在MSDOS中顯示爲8.3文件名。

由於Windows上的命令提示符是MSDOS中舊命令解釋器的演變,這意味着一些「不合時宜的」行爲(如3字母搜索模式)被保留,因此應用程序和腳本在「舊時代」 「舊計時器」不會中斷。

(另一個例子是事實,大多數Windows的文件系統是大小寫敏感的,是的,你猜,因爲MSDOS一個沒有外殼)

+0

(NTFS可以是[區分大小寫](http://support.microsoft.com/kb/100625)) – 2012-01-10 11:34:46

1

如果你想有一個解決辦法,你可以簡單地檢索所有文件路徑

var files = Directory.GetFiles(@"C:\tmp123"); 

,然後根據需要

var txtFiles = files.Where(f => f.EndsWith(".txt")); 
var txtxFiles = files.Where(f => f.EndsWith(".txtx")); 
0

這裏引申過濾它們是另一種變通方法,將篩選出的文件無線幫助個擴展,如 「.txtxt」:

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt"); 
相關問題