1

我想显示在任何位置具有“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

4 回答 4

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"))
于 2012-06-28T06:52:49.550 回答
2

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

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

于 2012-06-28T11:19:33.887 回答
0

*在结尾少了"*33",在结尾多放一颗星就好"*33*"

您当前的表达:“* 33”和“.PDF”的意思是,所有以它结尾的文件名33.PDF就是你得到1233.pdf而不是得到的原因2331.pdf

编辑: Directory.GetFileName()

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

于 2012-06-28T06:34:15.473 回答
0

我们发现

*___* 如果字符串的长度大于或等于 4,则过滤器 起作用。

因此,如果我想获取所有具有测试名称值的记录:

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

我的过滤器应该是:"*test" & ".PDF"它会给出想要的结果

test1234.pdf
123test45.pdf

供参考

于 2012-07-02T02:07:24.190 回答