在.NET';当搜索模式包含3个字符作为扩展名时,返回s Directory.GetFiles()
我最近遇到了一个来自Microsoft的奇怪功能: 假设我们的文件夹在.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的说法,这是预期的行为(请参见中的注释) 我的问题是: 为什么微软决定拥有如此奇怪的功能 如何克服这个问题?
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");