GetFiles() - 搜索模式

时间:2013-11-27 11:13:52

标签: c# getfiles

我使用以下行返回特定文件...

FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)

但是目录中还有其他文件扩展名为“.sbsar”,而且它们也正在获取它们。如何在搜索模式中区分“.sbs”和“.sbsar”?

4 个答案:

答案 0 :(得分:9)

您遇到的问题是Win32 API中搜索模式的limitation

  

具有完全文件扩展名(例如* .txt)的searchPattern   三个字符返回扩展名为3或更多的文件   字符,前三个字符与文件扩展名匹配   在searchPattern中指定。

我的解决方案是使用Linq手动过滤结果:

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
    StringComparison.InvariantCultureIgnoreCase));

答案 1 :(得分:5)

这是FindFirstFile下面的Win32 API(GetFiles())的行为反映在您身上。

如果必须使用GetFiles(),则需要进行自己的过滤。例如:

GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

或更有效率:

EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

请注意,我使用StringComparison.InvariantCultureIgnoreCase来处理Windows文件名不区分大小写的事实。

如果性能存在问题,即如果搜索必须处理包含大量文件的目录,那么执行两次过滤效率更高:一次调用GetFiles或{{1}一次清理不需要的文件名。例如:

EnumerateFiles

答案 2 :(得分:4)

尝试此操作,使用文件扩展名进行过滤。

  FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
            Where(f=>f.Extension==".sbs").ToArray<FileInfo>();

答案 3 :(得分:0)

docs

中提及
  

在searchPattern中使用星号通配符时,a   searchPattern,文件扩展名正好为三个字符   返回扩展名为三个或更多字符的文件   使用问号通配符,此方法仅返回   与指定文件扩展名匹配的文件。