我有一个简单的程序。它运行.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在引擎盖下使用此命令,因此上述结果?
答案 0 :(得分:7)
我使用*.xls
在我的计算机上进行了尝试,并返回了所有xlsx
个文件,正如MDSN所述。
我有Visual Studio 2013,在.NET 4.5上构建为Debug / Release Any CPU,并且在Win 8.1 X64上针对NTFS / FAT32分区运行,应该涵盖您的环境。你有什么特别的吗?
修改强>
根据此question,您可能通过运行以下命令在Win 8.1系统上禁用了8.3命名:
fsutil behavior set disable8dot3
您可以通过运行
查询当前状态fsutil behavior query disable8dot3 <VolumePath>
在我的机器上,它返回默认设置,如:
卷状态为:0(启用8dot3名称创建) 注册表状态为:2(每卷设置 - 默认值)。
基于以上两个设置,在c:
上启用了8dot3名称创建
答案 1 :(得分:4)
您的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