在Directory.GetFiles()中停止隐式通配符

时间:2009-09-28 17:56:10

标签: c# file directory filter

string[] fileEntries = Directory.GetFiles(pathName, "*.xml");

同样返回foo.xml_这样的文件有没有办法强制它不这样做,或者我必须编写代码来过滤返回结果。

这与命令提示符上的dir *.xml行为相同,但与在Windows资源管理器中搜索*.xml不同。

2 个答案:

答案 0 :(得分:4)

此行为是设计使然。从MSDN开始(查看注释部分和给出的示例):

  

具有文件扩展名的searchPattern   正好三个字符返回   扩展名为3或的文件   更多人物,前三名   字符与文件扩展名匹配   在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();

答案 1 :(得分: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";
            }));