c# EnumerateFiles 通配符返回不匹配?

标签 c# .net

作为一个简化的示例,我正在执行以下操作

IEnumerable<string> files = Directory.EnumerateFiles(path, @"2010*.xml", 
    SearchOption.TopDirectoryOnly).ToList();

在我的结果集中,我得到了一些与文件模式不匹配的文件。根据 msdn searchPattern 通配符是“零个或多个字符”而不是正则表达式。一个例子是我得到一个文件名作为“2004_someothername.xml”。

有关信息,文件夹中有超过 25,000 个文件。

有人知道发生了什么事吗?

最佳答案

这是由于 Windows 如何进行通配符匹配 - 它在其通配符搜索中包含编码的 8.3 文件名,从而导致一些令人惊讶的匹配!

解决此错误的一种方法是重新测试通过操作系统通配符匹配返回的所有文件结果,并通过通配符与每个(长)文件名的手动比较进行测试。另一种方式是turn off 8.3 filenames altogether via the registry .我曾多次被此问题困扰,包括在命令提示符下通过基于通配符的 del 命令删除重要(不匹配)文件。

总而言之,要非常小心,尤其是当您在一个目录中有许多文件时,如果您根据操作系统文件/通配符匹配做出任何关键的生产决策或采取任何操作,而没有对以下文件进行二次验证结果。

这是一个 explanation这种奇怪的行为。

来自 O'Reilly's site 的另一个解释.

关于c# EnumerateFiles 通配符返回不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262025/

相关文章:

c# - 异步读取输出时外部进程阻塞主线程

c# - 如何将 ValueTuple 命名功能与匿名方法一起使用?

c# - 我如何仅在 LINQ 查询中的日期时间中的日期上使用 group by

c# - 如何在 WPF 中将 CellTemplate 中的 TextBlock 居中?

c# - 您可以在选择项目之前在 linq 查询中设置属性吗?

c# - "Static"C#应用配置文件加密

c# - 为什么.NET RSACryptoServiceProvider 会抛出 "Safe handle has been closed"异常?

c# - C#中的主线程锁定

c# - 代码中添加<>是什么意思?

c# - 实现以泛型接口(interface)为参数的泛型接口(interface)