C# Directory.GetFiles使用SearchPattern返回意外结果

C# Directory.GetFiles使用SearchPattern返回意外结果,c#,.net,base-class-library,system.io.directory,C#,.net,Base Class Library,System.io.directory,我正在开发一个批处理程序,该程序处理大量文件(超过50000个文件),并且我在使用Directory.GetFiles方法时遇到了奇怪的行为 在此过程中,我移动符合以下搜索模式“*.pdf”的文件,并通过Directory.GetFiles方法获取文件: 我很惊讶地看到,有时候我移动了.pdfa文件 因此,我检查了,它清楚地表明,如果搜索模式包含一个带有3个字母的扩展名,那么每个扩展名以该扩展名开头的文件都将被返回 我用一个简单的程序进行了测试,它的行为与文档中所述的不同,它只在非常罕见的情况下

我正在开发一个批处理程序,该程序处理大量文件(超过50000个文件),并且我在使用
Directory.GetFiles
方法时遇到了奇怪的行为

在此过程中,我移动符合以下搜索模式“*.pdf”的文件,并通过
Directory.GetFiles
方法获取文件: 我很惊讶地看到,有时候我移动了.pdfa文件

因此,我检查了,它清楚地表明,如果搜索模式包含一个带有3个字母的扩展名,那么每个扩展名以该扩展名开头的文件都将被返回

我用一个简单的程序进行了测试,它的行为与文档中所述的不同,它只在非常罕见的情况下才会这样

使用此代码:

static void Main(字符串[]args){
var目录=@“E:\Test\”;
var files=Directory.GetFiles(Directory,*.pdf”);
foreach(文件中的var文件)
Console.WriteLine(文件);
}
我有一个结果:


您对此行为有何解释?

这是GetFiles方法的预期行为,在Windows上也是如此,如果您使用.pdf在目录中搜索,它将选择扩展名为.pdfa*.pdfaaa的文件,您需要在其中放置一个
()
你自己喜欢:

Directory.GetFiles(directory, "*.pdf").Where(item => item.EndsWith(".pdf"));
正如您所见,当我们在windows中搜索时,它给出的结果与您的代码给出的结果相同:


由于GetFiles的行为是这样的,您可能还想看看这是GetFiles方法的预期行为,在Windows上也是如此,如果您使用.pdf在目录中搜索,它将选择扩展名为.pdfa*.pdfaaa的文件,您需要自己放置一个
Where()
,如:

Directory.GetFiles(directory, "*.pdf").Where(item => item.EndsWith(".pdf"));
正如您所见,当我们在windows中搜索时,它给出的结果与您的代码给出的结果相同:


由于GetFiles的运行方式是这样的,您可能还想看看@luaan和@hans passant(非常感谢!)解释的,我没有找到扩展名为.pdfa的文件,因为我的硬盘上禁用了8.3格式

在启用8.3格式的硬盘上,该方法的行为与文档中所述的相同


GetFiles在启用或未启用设置时具有不同的行为

正如@luaan和@hans passant所解释的(非常感谢!),我没有找到扩展名为.pdfa的文件,因为我的硬盘上禁用了8.3格式

在启用8.3格式的硬盘上,该方法的行为与文档中所述的相同


GetFiles在启用或未启用设置时具有不同的行为

这是正常的不幸。虽然时间越来越长,但今天的文件系统卷仍然经常启用DOS 8.3名称支持。因此verylongname.pdfa将转换为verylo~1.pdf,您的搜索模式将与之匹配。需要后期筛选。正如您在屏幕截图的结果中所看到的,它不需要。您可以在屏幕截图中看到,.pdfa文件不在输出中。正如Hans所解释的,当文件的其他名称只有三个字母的扩展名时,它就会这样做,就像MS-DOS兼容的8.3名称一样。在您的示例中,文件显然没有8.3的名称,因此不匹配。伙计,不要对我大喊大叫。改为键入dir/x并对看到的内容大喊大叫。将其添加到问题中,而不是添加注释。但是在任何情况下,很明显这些文件没有8.3的名称,否则就会显示:)这是正常的灾难。虽然时间越来越长,但今天的文件系统卷仍然经常启用DOS 8.3名称支持。因此verylongname.pdfa将转换为verylo~1.pdf,您的搜索模式将与之匹配。需要后期筛选。正如您在屏幕截图的结果中所看到的,它不需要。您可以在屏幕截图中看到,.pdfa文件不在输出中。正如Hans所解释的,当文件的其他名称只有三个字母的扩展名时,它就会这样做,就像MS-DOS兼容的8.3名称一样。在您的示例中,文件显然没有8.3的名称,因此不匹配。伙计,不要对我大喊大叫。改为键入dir/x并对看到的内容大喊大叫。将其添加到问题中,而不是添加注释。但是无论如何,很明显文件没有8.3个名称——否则会显示:)如你在截图中看到的那样,它不!!我的输出中没有.pdfa文件问题的关键是它并不总是这样做
*.pdf
将只匹配正好是
pdf
的扩展名,而不是
pdfa
。但是,如果您有一个与该文件关联的8.3名称,您将得到
.pdfa
文件,因为它的8.3名称只有一个扩展名
pdf
,而不是
pdfa
。“如果您有一个与该文件关联的8.3名称”是什么意思?我认为每个文件都有一个与之关联的8.3名称,我错了?@PatriceVB如果您有NTFS,它可以被禁用()。在其他文件系统上,规则可能完全不同(CD、FAT、网络共享、ext…)。正如您在屏幕截图中所看到的,它没有!!我的输出中没有.pdfa文件问题的关键是它并不总是这样做
*.pdf
将只匹配正好是
pdf
的扩展名,而不是
pdfa
。但是,如果您有一个与该文件关联的8.3名称,您将得到
.pdfa
文件,因为它的8.3名称只有一个扩展名
pdf
,而不是
pdfa
。“如果您有一个与该文件关联的8.3名称”是什么意思?我认为每个文件都有一个与之关联的8.3名称,我错了?@PatriceVB如果您有NTFS,它可以被禁用()。在其他文件系统上,规则可能完全不同(CD、FAT、网络共享、ext…)。