Directory.GetFiles – 依赖于OS的不同输出

我有一个简单的程序。 它运行.NET 4.5并在Visual Studio 2013中构建。

D:\\MyDir充满了.xlsx文件,没有.xls文件。 当我在Windows 8.1 x64上运行该程序时, *.xls的filter不返回任何结果。 当我运行相同的程序,在Windows 7 x86上使用相同的.NET版本时, *.xlsfilter返回与*.xlsxfilter相同的结果。

两个系统上的测试文件夹肯定包含相同的数据。

我错过了什么,或者这是.NET和/或Windows中的错误?

各自的代码:

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace throw_test { static class Program { static void Main() { int fileCount1 = Directory.GetFiles("D:\\MyDir", "*.xlsx").Length; int fileCount2 = Directory.GetFiles("D:\\MyDir", "*.xls").Length; Console.WriteLine("File Count 1: " + fileCount1); Console.WriteLine("File Count 2: " + fileCount2); Console.Read(); } } } 

编辑1

当我使用Windows 8.1 x64中的命令提示符导航到该目录时:

  • dir *.xlsx按预期返回所有文件
  • dir *.xls返回’找不到文件’

Windows 7在上述两个命令中返回预期的文件。

我的猜测是.NET在引擎盖下使用这个命令,因此上面的结果呢?

您的Windows 7行为是设计使然 。 从GetFiles()方法的文档 (请参阅“备注”部分下面的第一个注释):

在searchPattern中使用星号通配符(例如“* .txt”)时,扩展名正好长度为三个字符时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。 具有正好三个字符的文件扩展名的searchPattern将返回扩展名为三个或更多字符的文件,其中前三个字符与searchPattern中指定的文件扩展名匹配。 文件扩展名为一个,两个或三个以上字符的searchPattern仅返回扩展名与searchPattern中指定的文件扩展名完全匹配的文件。

Windows 8.1的行为对我来说是不可复制的。 我刚刚在Windows 8.1 x64计算机上运行了测试,它符合预期的Windows 7行为。 我会检查机器上的当前文件夹是否正确。

我也可以通过打开命令提示符,导航到相应的目录,然后键入dir *.xls来获得相同的结果。 我希望GetFiles()函数和命令提示符都将搜索模式传递​​到相同的低级操作系统函数中。

它正在谈论一些不同的问题,但这篇文章也值得一读:

http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx

我尝试在我的机器上使用*.xls并返回所有xlsx文件,就像MDSN所描述的那样 。

我有Visual Studio 2013,在.NET 4.5上构建为Debug / Release Any CPU,在Win 8.1 X64上针对NTFS / FAT32分区运行,应覆盖您的环境。 你有什么特别的吗?

编辑

根据这个问题 ,您可能通过运行以下命令在Win 8.1系统上禁用8.3命名:

 fsutil behavior set disable8dot3 

您可以通过运行查询当前状态

 fsutil behavior query disable8dot3  

在我的机器上它返回默认设置,如:

卷状态为:0(启用8dot3名称创建)。
注册表状态为:2(每卷设置 – 默认值)。

基于以上两个设置,在c上启用了8dot3名称创建: