2009-09-28 55 views
4
string[] fileEntries = Directory.GetFiles(pathName, "*.xml"); 

也返回像foo.xml_文件有沒有辦法迫使它沒有這樣做,否則我將不得不編寫代碼來過濾返回的結果。停止隱含的通配符

這與命令提示符下的dir *.xml的行爲相同,但不同於在Windows資源管理器中搜索*.xml

回答

4

此行爲是設計使然。從MSDN(看給出的說明部分和示例):與正好三個字符的文件擴展名

一個是searchPattern返回 文件有三個或 多個字符,其中前三個 字符匹配的延伸在searchPattern中指定的文件擴展名 。

如下你可以限制它:

C#2.0:

string[] fileEntries = Array.FindAll(Directory.GetFiles(pathName, "*.xml"), 
    delegate(string file) { 
     return String.Compare(Path.GetExtension(file), ".xml", StringComparison.CurrentCultureIgnoreCase) == 0; 
    }); 
// or 
string[] fileEntries = Array.FindAll(Directory.GetFiles(pathName, "*.xml"), 
    delegate(string file) { 
     return Path.GetExtension(file).Length == 4; 
    }); 

C#3.0:

string[] fileEntries = Directory.GetFiles(pathName, "*.xml").Where(file => 
    Path.GetExtension(file).Length == 4).ToArray(); 
// or 
string[] fileEntries = Directory.GetFiles(pathName, "*.xml").Where(file => 
    String.Compare(Path.GetExtension(file), ".xml", 
     StringComparison.CurrentCultureIgnoreCase) == 0).ToArray(); 
+0

對於這種看似怪異行爲的原因你知道嗎?舊版8.3文件名的東西? – 2009-09-28 18:24:30

+0

我的目標是2.0框架,所以我不能使用=>語法。 – 2009-09-28 18:28:54

+0

@Dan:更新代碼以使用匿名代理。 @Jon Seigel:是的,這是正確的。 MSDN鏈接上的另一個提示提到該方法「使用8.3文件名格式和長文件名格式檢查文件名」。 – 2009-09-28 18:59:55

2

這是由於Windows的8.3搜索方法。如果您嘗試搜索「* .xm」,則會得到0個結果。

您可以在.NET 2.0中使用這樣的:

string[] fileEntries = 
Array.FindAll<string>(System.IO.Directory.GetFiles(pathName, "*.xml"), 
      new Predicate<string>(delegate(string s) 
      { 
       return System.IO.Path.GetExtension(s) == ".xml"; 
      }));