在.NET';当搜索模式包含3个字符作为扩展名时,返回s Directory.GetFiles()

在.NET';当搜索模式包含3个字符作为扩展名时,返回s Directory.GetFiles(),.net,getfiles,system.io.directory,.net,Getfiles,System.io.directory,我最近遇到了一个来自Microsoft的奇怪功能: 假设我们的文件夹c:\tmp123包含3个文件- 1.txt 2.txtx 3.txtxt a) 调用Directory.GetFiles(@“C:\tmp123”,“*.txt”)将生成3个返回项。 b) 调用Directory.GetFiles(@“C:\tmp123”,“*.txtx”)将生成1个返回的项目 根据Microsoft的说法,这是预期的行为(请参见中的注释) 我的问题是: 为什么微软决定拥有如此奇怪的功能 如何克服这个问题?

我最近遇到了一个来自Microsoft的奇怪功能:

假设我们的文件夹
c:\tmp123
包含3个文件-
1.txt

2.txtx

3.txtxt

a) 调用
Directory.GetFiles(@“C:\tmp123”,“*.txt”)
将生成3个返回项。
b) 调用
Directory.GetFiles(@“C:\tmp123”,“*.txtx”)
将生成1个返回的项目

根据Microsoft的说法,这是预期的行为(请参见中的注释)

我的问题是:

  • 为什么微软决定拥有如此奇怪的功能

  • 如何克服这个问题?
    i、 e.如何使搜索模式只返回
    *.txt
    扩展名,而不返回
    *.txtxt
    *.txtstarngefunctionality


  • 我敢打赌这与向后兼容性有关。我没有看到提到这个问题,但提到了这方面的一些奇怪之处:

    […]FCB匹配算法的一些怪癖一直存在于Win32中,因为 它们已成为成语

    例如,如果您的模式以
    *
    结尾,则
    *
    被忽略。如果没有此规则,模式
    *.*
    将仅匹配 包含一个点的文件,它可能会破坏所有文件的90% 地球上的批处理文件以及每个人的肌肉记忆 每个运行Windows NT 3.1的人都是在一个
    *.*
    意味着 所有文件

    另一个例子是,以点结尾的图案实际上并不 匹配以点结尾的文件;它匹配没有扩展名的文件。 如果一个问号立即出现,它可以匹配零个字符 在一个点之前


    原因是向后兼容

    Windows最初是建立在MSDOS之上的图形界面,MSDOS的文件名只有8个字符,扩展名最多3个字符。MSDOS文件系统的扩展允许Windows具有更长的文件名和扩展名,但这些文件名和扩展名在MSDOS中仍然显示为8.3文件名

    由于Windows上的命令提示符是MSDOS中旧命令解释器的演变,这意味着保留了一些“不合时宜”的行为(如3个字母的搜索模式),因此在“旧时代”或“旧时代”构建的应用程序和脚本不会中断


    (另一个例子是,大多数windows文件系统都不区分大小写,是的,你猜到了,因为MSDOS one没有外壳)

    如果你想解决这个问题,你可以简单地检索所有的文件路径

    var files = Directory.GetFiles(@"C:\tmp123");
    
    然后根据需要扩展过滤它们

    var txtFiles = files.Where(f => f.EndsWith(".txt"));
    var txtxFiles = files.Where(f => f.EndsWith(".txtx"));
    

    下面是另一个有助于筛选出扩展名为“.txtxt”的文件的解决方法:

    var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt");