作为一个简化的示例,我正在执行以下操作
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/