如何在VB.NET中获取目录上的所有文件名

时间:2012-06-28 06:08:34

标签: vb.net winforms file search wildcard

我想显示所有位置都有“33”的PDF文件名。

PDFFiles文件夹上的pdf列表

1111.pdf
3311.pdf
2222.pdf
2331.pdf
1234.pdf
1233.pdf

我需要得到这样的结果,这是sql上的喜欢通配符%33%

3311.pdf
2331.pdf
1233.pdf

我试过这个

Me.ListBox1.Items.AddRange(Directory.GetFiles("C:\PDFFiles", "*33*" & ".PDF", SearchOption.AllDirectories))

但它仍会显示所有pdf文件。

1111.pdf
3311.pdf
2222.pdf
2331.pdf
1234.pdf
1233.pdf

和这个

Me.ListBox1.Items.AddRange(Directory.GetFiles("C:\PDFFiles", "*33" & ".PDF", SearchOption.AllDirectories))

但它只能

1233.pdf //this get all filename that ends with 33

表示感谢

4 个答案:

答案 0 :(得分:2)

当使用多个*时,我也注意到了这种行为。

我通过获取所有文件名然后使用LINQ过滤正确的名称来解决它:

Dim allFileNames as String() = _ 
    Directory.GetFiles("C:\PDFFiles", "*.PDF", SearchOption.AllDirectories)
Dim filtered As IEnumerable(Of String) = _ 
    .Where(Function(fileName) Path.GetFileNameWithoutExtension(fileName).Contains("33"))

答案 1 :(得分:2)

如果习惯使用正则表达式,通配符的模式匹配算法会很奇怪。它背后有很多历史,可以追溯到Windows 3,MS-DOS,CP / M(8位机器的操作系统)和RSX(16位DEC机器上的操作系统)。他们之间的借贷很多,包括通配符行为。一些偶然的共性btw,大卫卡特勒是第一个和最后一个背后的主要建筑师。

Anyhoo,*33*无效。您需要应用自己的过滤器。搜索*.**.pdf并使用Path.GetFileNameWithoutExtension()和String.Contains()来查找匹配项。

答案 2 :(得分:0)

*结束时你遗失了"*33",在"*33*"的末尾又放了一颗星。

您当前的表达:“* 33”& “.PDF”表示所有文件名以33.PDF结尾,这就是您获得1233.pdf而非2331.pdf

的原因

编辑: Directory.GetFileName()

  

类似于"*1*.txt"的搜索模式可能会返回意外的文件名。   例如,使用“ 1 .txt”的搜索模式返回   “longfilename.txt”因为等效的8.3文件名格式是   “LONGFI〜1.TXT”。

答案 3 :(得分:0)

我们发现了

如果字符串的长度大于或等于4,则过滤*___*

所以如果我想获得所有具有测试名称值的记录:

test1234.pdf
abcdefg.pdf
123test45.pdf
12345678.pdf

我的过滤器应为:"*test" & ".PDF"它会提供所需的结果

test1234.pdf
123test45.pdf

FYI