[英]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.tif
和GZ96A7005001.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.