12

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

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

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

4

4 回答 4

9

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

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

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

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
    StringComparison.InvariantCultureIgnoreCase));
于 2013-11-27T11:18:40.260 回答
7

试试这个,使用文件扩展名过滤。

  FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
            Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
于 2013-11-27T11:30:58.287 回答
5

FindFirstFile这就是下面GetFiles()反映给您的 Win32 API ( ) 的行为。

如果您必须使用GetFiles(). 例如:

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

或者更有效:

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

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

如果性能是一个问题,也就是说,如果搜索必须处理包含大量文件的目录,那么执行两次过滤会更有效:一次在对GetFilesor的调用中EnumerateFiles,一次用于清理不需要的文件名。例如:

GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));
于 2013-11-27T11:17:47.393 回答
0

它在文档中提到

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

于 2013-11-27T11:20:11.947 回答