string[] fileEntries = Directory.GetFiles(pathName, "*.xml");
也返回像foo.xml_
文件有沒有辦法迫使它沒有這樣做,否則我將不得不編寫代碼來過濾返回的結果。停止隱含的通配符
這與命令提示符下的dir *.xml
的行爲相同,但不同於在Windows資源管理器中搜索*.xml
。
string[] fileEntries = Directory.GetFiles(pathName, "*.xml");
也返回像foo.xml_
文件有沒有辦法迫使它沒有這樣做,否則我將不得不編寫代碼來過濾返回的結果。停止隱含的通配符
這與命令提示符下的dir *.xml
的行爲相同,但不同於在Windows資源管理器中搜索*.xml
。
此行爲是設計使然。從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();
這是由於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";
}));
對於這種看似怪異行爲的原因你知道嗎?舊版8.3文件名的東西? – 2009-09-28 18:24:30
我的目標是2.0框架,所以我不能使用=>語法。 – 2009-09-28 18:28:54
@Dan:更新代碼以使用匿名代理。 @Jon Seigel:是的,這是正確的。 MSDN鏈接上的另一個提示提到該方法「使用8.3文件名格式和長文件名格式檢查文件名」。 – 2009-09-28 18:59:55