2009-06-08 73 views
0

目錄'C:\ temp'有兩個名爲'GZ96A7005.tif'和'GZ96A7005001.tif'的文件。他們有不同的長度和相同的擴展名。現在我運行下面的代碼:C#:使用Directory.GetFiles獲取固定長度的文件

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

的 'resultFileNames' 迴歸兩項 'C:\ TEMP \ GZ96A7005.tif' 和 'C:\ TEMP \ GZ96A7005001.tif'。 但窗口搜索將正常工作。這就是爲什麼以及如何得到我想要的?

alt text

回答

5

我知道我在之前的某個地方閱讀過這篇文章,但現在我能找到的最好的文章是Raymond Chen's blog post。重點在於Windows爲了向後兼容性而爲每個帶有長文件名的文件保留一個短的文件名(8.3),並且文件名通配符與長文件名和短文件名相匹配。您可以通過打開命令提示符並運行「dir /x」來查看這些短文件名。通常,獲取匹配????????.tif(8)的文件列表將返回文件名列表中包含8個或更少字符的文件和.tif擴展名。但是,每個帶有長文件名的文件也都有一個帶有8.3個字符的短文件名,因此它們全都匹配此篩選器

在你的情況下,兩個GZ96A7005.tifGZ96A7005001.tif是長文件名,所以它們都具有相匹配????????.tif(8個或更多?的任何東西)8.3短文件名。

UPDATE ...從MSDN

因爲針對用8.3文件名 格式和長文件名格式 文件名, 類似的搜索模式,方法檢查「*1*.txt」 可能會返回意外的文件名。例如,對於 示例,使用 「*1*.txt」的搜索模式將返回「longfilename.txt」 ,因爲等效的8.3文件名 格式爲「LONGFI~1.TXT」。


UPDATE:MSDN文檔specifiy爲 「?」 通配符在Directory.GetFiles不同的行爲()和DirectoryInfo.GetFiles()。但是,文檔似乎是錯誤的。見Matthew Flaschen's answer

1

The?字符匹配「零個或一個」字符......因此,根據您的具體情況,我會設想您的搜索模式將匹配任何以「.tif」結尾的長度介於0到12個字符之間的文件。

嘗試刪除另一個文件,只有三個字符長,擴展名爲「.tif」,並查看代碼是否也選擇了該文件。我有一個偷偷摸摸的懷疑,它會;)

就Windows搜索而言,它是絕對不是在引擎蓋下使用相同的算法。這個?與Directory.GetFiles(string,string)方法的.Net搜索模式規範中的字符可能具有非常不同的含義。

7

對於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符合文檔。如果微軟的落實沒有,他們有一個錯誤:

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

但'DirectoryInfo.GetFiles'也返回兩個項'c:\ temp \ GZ96A7005.tif'和'c:\ temp \ GZ96A7005001.tif'。 – 2009-06-08 03:20:47

+0

Leon,你可以發佈你使用DirectoryInfo.GetFiles的確切代碼嗎? – 2009-06-08 03:26:12

+0

DirectoryInfo.GetFiles()爲我匹配零個或一個字符。 .NET 3.5 SP1。也許這種行爲是以前版本中的一個錯誤。當然,他們的行爲不同。 – Lucas 2009-06-08 04:40:58

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

有點昂貴與字符串替換。你可以添加你需要的任何擴展名。