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

rhu*_*hes 9 .net c# 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;
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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑1

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

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

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

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

Gil*_*dor 7

我尝试使用我的机器*.xlsxlsx返回所有文件,就像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
Run Code Online (Sandbox Code Playgroud)

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

fsutil behavior query disable8dot3 <VolumePath>
Run Code Online (Sandbox Code Playgroud)

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

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

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


Joe*_*orn 4

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

在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名恰好为三个字符长时的匹配行为与扩展名多于或少于三个字符长时的匹配行为不同。文件扩展名恰好为三个字符的 searchPattern 返回扩展名为三个或更多字符的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。文件扩展名为 1 个、2 个或多于 3 个字符的 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