【发布时间】:2010-12-02 02:04:27
【问题描述】:
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";
}));
【讨论】: