【问题标题】:Directory.GetFiles - different output dependent on OSDirectory.GetFiles - 取决于操作系统的不同输出
【发布时间】:2013-12-02 03:42:59
【问题描述】:

我有一个简单的程序。它运行 .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 在后台使用了这个命令,所以上面的结果?

【问题讨论】:

  • 看起来像一个内置的 Windows 应用程序兼容性魔法。需要进一步调查。
  • @ogggre 它与 8.1 没有任何兼容性,它在 MSDN 中用于 GetFiles“... 给定两个文件,file1.txtfile1.txtother,在一个目录中,一个搜索模式file?.txt 只返回第一个文件,而 file*.txt 的搜索模式返回两个文件。“他的 8.1 机器运行不正确,结果应该已经显示出来了。
  • 我找不到参考资料(我认为它可能是 Raymond Chen 的帖子),但 IIRC,这是旧版本 Windows 的“功能”,可以追溯到 dos 时代。
  • @ScottChamberlain 你是对的,在 Windows 8.1 64 位上尝试过,结果根据 MSDN,*.xls 过滤器返回与 *.xlsx 过滤器相同的结果。
  • 嗯...我认为这是我正在寻找的文章:blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx ...但我没有讨论那个特殊的怪癖。它谈论的是另一组奇怪的模式。

标签: c# .net visual-studio .net-4.5 visual-studio-2013


【解决方案1】:

我在我的机器上尝试使用*.xls 并返回所有xlsx 文件,正如MDSN 所述。

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

编辑

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

fsutil behavior set disable8dot3

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

fsutil behavior query disable8dot3 <VolumePath>

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

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

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

【讨论】:

    【解决方案2】:

    您的 Windows 7 行为是设计。来自documentation on the GetFiles() method(参见“备注”部分下方的第一个注释):

    在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2012-07-22
      • 2021-09-18
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多