C# Directory.GetFiles-不同的输出取决于操作系统

C# Directory.GetFiles-不同的输出取决于操作系统,c#,.net,visual-studio,.net-4.5,visual-studio-2013,C#,.net,Visual Studio,.net 4.5,Visual Studio 2013,我有一个简单的程序。它运行.NET 4.5,在Visual Studio 2013中构建 D:\\MyDir充满了.xlsx文件,没有.xls文件。当我在Windows 8.1 x64上运行该程序时,*.xls的过滤器不会返回任何结果。当我在Windows 7 x86上运行相同的.NET版本的相同程序时,*.xls过滤器返回与*.xlsx过滤器相同的结果 两个系统上的测试文件夹肯定包含相同的数据 我是否遗漏了什么,或者这是.NET和/或Windows中的错误 相关代码: using System

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

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

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

我是否遗漏了什么,或者这是.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在引擎盖下使用了这个命令,因此产生了上述结果?

我在我的机器上用
*.xls
进行了尝试,并且返回了所有
xlsx
文件,正如所述

我有Visual Studio 2013,构建为调试/发布.NET 4.5上的任何CPU,并在Win 8.1 X64上运行NTFS/FAT32分区,应该可以覆盖您的环境。还有什么特别的吗

编辑

据此,您可能已通过运行以下命令禁用Win 8.1系统上的8.3命名:

fsutil behavior set disable8dot3
您可以通过运行来查询当前状态

fsutil behavior query disable8dot3 <VolumePath>
fsutil行为查询禁用8dot3
在我的机器上,它返回默认设置,如:

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

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


您的Windows 7行为是设计的。来自(见“备注”部分下面的第一个注释):

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

Windows 8.1的行为对我来说是不可复制的。我刚刚在我的Windows8.1x64机器上运行了一个测试,它符合预期的Windows7行为。我将检查机器上的当前文件夹是否正确

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

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


看起来像是一个内置的Windows魔法,用于实现应用程序兼容性。需要进一步调查。@ogggre它对8.1没有任何兼容性,它在MSDN的GetFiles中是正确的“…给定两个文件,
file1.txt
file1.txtother
,在目录中,
file?.txt
的搜索模式只返回第一个文件,而
file*.txt
的搜索模式则返回两个文件。”他的8.1机器运行不正确,结果应该显示出来。我找不到参考(我想可能是Raymond Chen的帖子),但IIRC,这是旧版本Windows的一个“功能”,可以追溯到dos时代。@ScottChamberlain你说得对,在Windows 8.1 64位上试用,结果符合MSDN,*.xls过滤器返回与*.xlsx过滤器相同的结果。。。我想这就是我要找的文章:。。。但我没有讨论这个特殊的怪癖。它说的是另外一套奇怪的图案。