2012-06-09 84 views
2

比方說,我有一個目錄「C:\測試」三個文件吧:防止Directory.GetFiles()從搜索短文件名

A23456789.txt 
A1.txt 
G 5.txt 

我運行此命令:

Dim FileArr = Directory.GetFiles("C:\Test", "*1.txt", SearchOption.AllDirectories) 

返回所有三個文件。

我明白,這是由設計和.NET搜索8.3短文件名。
但是有沒有什麼辦法可以覆蓋這個,只搜索實際的文件名?

當然,在這個時代,必須有一個功能來做到這一點。或者我必須寫我自己的?
我希望搜索功能具有與Windows資源管理器相同的行爲以保持一致性。

+0

添加一個名爲「foo.txtbar」文件看一下通配符已經失去了利用價值。 –

+0

Windows資源管理器不會被這個困惑,只有GetFiles()函數。看來該功能的匹配功能已過時。從用戶的角度來看,什麼是通配符的好替代? – mcu

回答

2

這使用LINQ:

Dim FileArr = IO.Directory.GetFiles("C:\Test", "*.txt", SearchOption.AllDirectories). _ 
    Where(Function(s) s Like "*1.txt") 
+0

「Like」運算符並不總是產生與Windows資源管理器相同的結果,這是大多數用戶最熟悉的結果。但我想這是我們能做的最好的事情,而不是試圖自己實現Explorer算法。順便說一句,算法發佈在任何地方? – mcu

+0

在光明的一面,玩'Like'運算符讓我發現了一個bug。檢查出來:http://stackoverflow.com/questions/10971777/possible-bug-in-vb-net-like-operator – mcu

3

我認爲最好的辦法是從GetFiles去除過濾器,並與LINQ,在那裏你有一點點更多的控制篩選出來:

Dim FileArr = Directory.GetFiles("C:\Test", "*.txt", SearchOption.AllDirectories) 
Dim filtered = From f In FileArr Where Path.GetFileName(f).EndsWith("1.txt") 

或者一些等價的。

+0

謝謝。我以前從未使用過LINQ。它是否與Windows資源管理器一樣支持通配符? – mcu

+0

@mcu如果您之前從未使用LINQ(語言集成查詢),請查看[MSDN上的文檔](http://msdn.microsoft.com/zh-cn/library/bb763068.aspx)以瞭解更多。 LINQ是一個非常強大的查詢/過濾構造。它可以查詢/過濾任何集合,而不僅僅是文件。 – vcsjones