C#:使用Directory.GetFiles获取具有固定长度的文件

Jas*_*ing 0 .net c# windows filenames long-filenames

目录'C:\ temp'有两个名为'GZ96A7005.tif'和'GZ96A7005001.tif'的文件.它们具有不同的长度和相同的扩展名.现在我运行下面的代码:

string[] resultFileNames = Directory.GetFiles(@"C:\temp", "????????????.tif");
Run Code Online (Sandbox Code Playgroud)

'resultFileNames'返回两个项'c:\ temp\GZ96A7005.tif'和'c:\ temp\GZ96A7005001.tif'.但是Window Search可以正常工作.这就是为什么以及如何得到我想要的?

替代文字

Mat*_*hen 7

对于Directory.GetFiles,?表示"完全为零一个字符".另一方面,您可以使用DirectoryInfo.GetFiles,为此?表示"完全是一个角色"(显然你想要的).

编辑:

完整代码:

string[] resultFileNames = (from fileInfo in new DirectoryInfo(@"C:\temp").GetFiles("????????????.tif") select fileInfo.Name).ToArray();
Run Code Online (Sandbox Code Playgroud)

你可以跳过ToArray,让resultFileNames成为一个IEnumerable<string>.

人们报告这在MS .NET上对他们不起作用.以下精确代码适用于Ubuntu Hardy上的Mono.我同意两个相关的类使用不同的约定是没有意义的.但是,这就是文档(上面链接)所说的,Mono符合文档.如果微软的实现没有,他们就有一个错误:

using System;
using System.IO;
using System.Linq;

public class GetFiles
{
    public static void Main()
    {
        string[] resultFileNames = (from fileInfo in new DirectoryInfo(@".").GetFiles("????????????.tif") select fileInfo.Name).ToArray();
        foreach(string fileName in resultFileNames)
        {
            Console.WriteLine(fileName);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*cas 5

我知道我之前已经在某处读过这篇文章了,但我现在能找到的最好的是Raymond Chen博客文章中对它的引用.关键是Windows为每个具有长文件名的文件保留一个短(8.3)文件名,以实现向后兼容性,并且文件名通配符与长文件名和短文件名匹配.您可以通过打开命令提示符并运行" dir /x" 来查看这些短文件名.通常,获取匹配????????.tif(8)的文件列表会返回文件名和.tif扩展名中包含8个或更少字符的文件列表.但是,具有长文件名的每个文件也都有一个包含8.3个字符的短文件名,因此它们都匹配此过滤器.

你的情况都GZ96A7005.tifGZ96A7005001.tif长文件名,所以它们都具有相匹配的8.3短文件名????????.tif(含8个或更多东西?的).

更新...来自MSDN:

由于此方法使用8.3文件名格式和长文件名格式检查文件名,因此类似于" *1*.txt" 的搜索模式可能会返回意外的文件名.例如,使用" *1*.txt" 的搜索模式返回" longfilename.txt",因为等效的8.3文件名格式为" LONGFI~1.TXT".


更新:MSDN文档为?Directory.GetFiles()和DirectoryInfo.GetFiles()中的" "通配符指定了不同的行为.但是,文档似乎是错误的.请参阅Matthew Flaschen的回答.