簡體   English   中英

C#:使用Directory.GetFiles獲取固定長度的文件

[英]C#: Using Directory.GetFiles to get files with fixed length

目錄“ C:\\ temp”具有兩個名為“ GZ96A7005.tif”和“ GZ96A7005001.tif”的文件。 它們具有相同擴展名的不同長度。 現在我運行以下代碼:

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

'resultFileNames'返回兩個項目'c:\\ temp \\ GZ96A7005.tif'和'c:\\ temp \\ GZ96A7005001.tif'。 但是窗口搜索可以正常工作。 這就是為什么,我如何得到我想要的?

替代文字

對於Directory.GetFiles ,? 表示“正好為零一個字符”。 另一方面,您可以使用DirectoryInfo.GetFiles ,為此? 表示“正好一個字符”(顯然是您想要的)。

編輯:

完整代碼:

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

您可能可以跳過ToArray,而只需讓resultFileNames為IEnumerable<string>

人們在MS .NET上報告說這不適用於他們。 下面的確切代碼對我適用於Ubuntu Hardy上的Mono。 我同意兩個相關的類使用不同的約定實際上沒有任何意義 但是,這就是文檔(上面鏈接)所說的,Mono符合這些文檔。 如果Microsoft的實現未實現,則它們會出現一個錯誤:

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);
        }
    }
}

我知道我以前曾在某處閱讀過有關此內容的信息,但現在最好的是在Raymond Chen的博客文章中對此內容的引用。 關鍵是Windows會為每個具有長文件名的文件保留一個短文件名(8.3),以實現向后兼容性,並且文件名通配符會與長文件名和短文件名匹配 您可以通過打開命令提示符並運行“ dir /x ”來查看這些短文件名。 通常,獲取與????????.tif (8)匹配的文件列表將返回文件名中包含8個或更少字符以及.tif擴展名的文件列表。 但是, 每個文件名較長的文件也都具有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的答案

字符匹配“零個或一個”字符...因此,根據您的想象,我想您的搜索模式將匹配任何以“ .tif”結尾的文件,且文件長度在零至十二個字符之間。

嘗試刪除只有三個字符長且帶有“ .tif”擴展名的另一個文件,並查看代碼是否也可以識別該文件。 我暗中懷疑它將;)

就Windows搜索而言,它絕對不是在后台使用相同的算法。 字符的含義可能與Directory.GetFiles(string,string)方法的.Net搜索模式規范中的含義完全不同。

string path = "C:/";
var files = Directory.GetFiles(path)
    .Where(f => f.Replace(path, "").Length == 8);

更換琴弦有點昂貴。 您可以添加所需的任何擴展名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM