7

我最近遇到了微软的一个奇怪的功能:

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

Directory.GetFiles(@"C:\tmp123", "*.txt")a)在 3 个返回的项目中调用yield。
b)Directory.GetFiles(@"C:\tmp123", "*.txtx")在 1 个返回的项目中调用 yield。

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

我的问题是:

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

  2. 我该如何克服这个问题?
    即,我如何拥有一个*.txt仅返回扩展名而不返回*.txtx,*.txtstarngefunctionality等的搜索模式?

4

4 回答 4

2

The reason for this is backwards compatibility.

Windows was initially built as a graphical interface on top of MSDOS which only had files with 8 characters for the name and a maximum of 3 for the extension. Extentions to the MSDOS file systems allowed Windows to have longer file names and extensions but these would still show up as 8.3 file names in MSDOS.

Since the command prompt on Windows is an evolution of the old command interpreter in MSDOS this means some "anachronistic" behaviours (like the 3 letter search pattern) were kept so applications and scripts built in the "old days" or by "old timers" wouldn't break.

(another example is the fact most windows file systems are case insensitive, yes, you guessed, because the MSDOS one didn't have casing)

于 2012-01-10T10:43:33.790 回答
2

如果您想要一种解决方法,您可以简单地检索所有文件路径

var files = Directory.GetFiles(@"C:\tmp123");

然后根据需要通过扩展过滤它们

var txtFiles = files.Where(f => f.EndsWith(".txt"));
var txtxFiles = files.Where(f => f.EndsWith(".txtx"));
于 2012-01-10T13:39:47.773 回答
0

这是另一种解决方法,有助于过滤掉带有“.txtxt”等扩展名的文件:

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt");
于 2014-09-24T22:43:20.307 回答
0

我愿意打赌这与向后兼容性有关。我没有看到提到这个确切的问题,但是这个 Raymond Chen 博客文章提到了这个领域的一些奇怪之处:

[...] FCB 匹配算法的一些怪癖仍然存在于 Win32 中,因为它们已成为惯用语。

例如,如果您的模式以 结尾.*.*则忽略 。如果没有这条规则,该模式*.*将只匹配包含点的文件,这将破坏地球上大约 90% 的批处理文件,以及每个人的肌肉记忆,因为每个运行 Windows NT 3.1 的人都在一个*.*意味着所有文件。

再举一个例子,以点结尾的模式实际上并不匹配以点结尾的文件。它匹配没有扩展名的文件。如果问号紧接在点之前,它可以匹配零个字符。

于 2012-01-10T09:07:25.633 回答