Directory.GetDirectories返回错误的结果,模式为*。*

时间:2017-02-22 16:20:52

标签: c# .net windows-10

假设您有一个包含以下目录的目录:

  

dontgetme
get.me

如果您使用以下代码:

string[] directories = Directory.GetDirectories(rootDirectory, "*.*", SearchOption.TopDirectoryOnly);

您希望directories包含:

  

get.me

但它包含两个目录,为什么会这样?

查看documentation唯一的通配符为*?,因此他们不应该对此产生影响。

此外,如果您使用模式*.,则仅返回dontgetme目录;但是使用*.*.*.*等仍然会返回。

如果重要,我在Windows 10上使用.NET 4.6.1和C#6。

3 个答案:

答案 0 :(得分:3)

你的模式意味着"任何具有任何扩展名的东西"。 没有扩展程序 "任何扩展程序",因此您匹配所有四个。

您可以尝试?*.?*作为模式,这样您就可以获得至少包含一个字符作为扩展名称的字符。

答案 1 :(得分:2)

Windows文件和目录名称始终具有扩展名,即使它是空白的。因此props// Collection component export default { props: ['cid'], template: ..., } // Breadcrumb component export default { props: ['cid', 'iid'], template: ..., } 匹配,因为它被视为*.*

答案 2 :(得分:1)

原因归结为兼容性决定。最终,C#最终会调用Win32 FindFirstFile方法进行搜索。

调查一下,我实际上找到了解释它的this answer

我将重复该答案的引用(摘自this blog post):

  

例如,如果您的模式以.*结尾,则忽略.*。如果没有这个规则,模式将仅匹配包含点的文件,这可能会破坏地球上所有批处理文件的90%,以及每个人的肌肉记忆,因为每个人都运行Windows NT 3.1在*.*表示所有文件的世界中长大。

同一问题的other answer也解释了涉及*.的行为(强调我的):

  

*.*匹配目标目录中的所有内容。

     

这是因为*.匹配到最后一段时间;如果名称中有 no 句点,则该名称将被视为在一段时间内结束; 因此,如果您在*.的末尾添加.afile / adirname*仅匹配以句点开头的名称和不包含句点的名称*.*)然后它也匹配超出最后一个时期,因此包括一个包含句点的文件名,这涵盖了所有可能的文件名。