【问题标题】:Prevent Directory.GetFiles() from searching short file names防止 Directory.GetFiles() 搜索短文件名
【发布时间】:2012-06-09 14:13:56
【问题描述】:

假设我有一个目录“C:\Test”,其中包含三个文件:

A23456789.txt
A1.txt
G 5.txt

然后我运行这个命令:

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

所有三个文件都返回。

我知道这是设计使然,.NET 也会搜索 8.3 短文件名。
但是有没有办法覆盖它并只搜索实际的文件名?

当然,在这个时代,必须有一个功能来做到这一点。还是我必须自己写?
我希望搜索功能具有与 Windows 资源管理器相同的行为以保持一致性。

【问题讨论】:

  • 添加一个名为“foo.txtbar”的文件,看看通配符已经过时了。
  • Windows 资源管理器不会被这个混淆,只有 GetFiles() 函数。该功能的匹配功能似乎已过时。从用户的角度来看,什么是通配符的好替代品?

标签: vb.net file pattern-matching filenames wildcard


【解决方案1】:

我认为最好的方法是从 GetFiles 中删除过滤器并使用 LINQ 将其过滤掉,您可以在其中拥有更多控制权:

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

或类似的。

【讨论】:

  • 谢谢。我以前从未使用过 LINQ。它对通配符的支持是否与 Windows Explorer 相同?
  • @mcu 如果您以前从未使用过 LINQ(语言集成查询),请查看documentation on MSDN 了解更多信息。 LINQ 是一个非常强大的查询/过滤结构。它可以查询/过滤任何集合,而不仅仅是文件。
【解决方案2】:

这使用 LINQ:

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

【讨论】:

  • Like 运算符并不总是产生与大多数用户最熟悉的 Windows 资源管理器相同的结果。但我想这是我们能做的最好的事情,没有尝试自己实现 Explorer 算法。顺便说一句,该算法是否在任何地方发布?
  • 从好的方面来说,玩Like 运算符让我发现了一个错误。看看这个:stackoverflow.com/questions/10971777/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多