【问题标题】:How to get all Filenames on Directory in VB.NET如何在 VB.NET 中获取目录上的所有文件名
【发布时间】:2012-06-28 06:08:33
【问题描述】:

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

PDFFiles 文件夹上的示例 pdf 列表

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

我需要得到这样的结果,即 like 通配符 %33% 在 sql 上

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

在此致谢

【问题讨论】:

  • 为什么第一行代码不起作用 - 将通配符包含在 33 周围?我可以看到为什么底线只返回一个单一的文件。

标签: vb.net winforms file search wildcard


【解决方案1】:

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

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

【讨论】:

    【解决方案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"))
    

    【讨论】:

    • 嗨 @Erno 我应该在 allFileNames 中使用什么对象并进行过滤?我正在使用 VB.NET
    【解决方案3】:

    "*33" 后面少了*,在"*33*" 后面多加一颗星。

    您当前的表达式:“*33”和“.PDF”表示,所有以33.PDF 结尾的文件名,这就是为什么您得到1233.pdf 而不是2331.pdf

    编辑: Directory.GetFileName()

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

    【讨论】:

    • @BizApps,您的帖子中有多个 GetFiles 语句,上面的一个应该可以工作,可能您正在尝试第二个
    • @MD.UNicorn 它显示我的目录中列出的所有 pdf 文件
    • @BizApps:我们仍然坚持您帖子顶部的第一个应该可以工作!
    • @BizApps,您确定您的文件名不是长名称吗?检查编辑答案和链接,还在 `C:\PDFFiles\` 的末尾添加一个额外的反斜杠。
    • @MD.Unicorn 我还认为将 * 放在最后会起作用,但仍会显示所有文件名,但不是我想要的结果。
    【解决方案4】:

    我们发现

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

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

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

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

    test1234.pdf
    123test45.pdf
    

    仅供参考

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2019-01-21
      • 2010-11-30
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多