我正在使用以下行返回特定文件...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
但是目录中还有其他带有扩展名的文件.sbsar
,它也正在获取它们。如何区分搜索模式.sbs
和.sbsar
搜索模式?
我正在使用以下行返回特定文件...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
但是目录中还有其他带有扩展名的文件.sbsar
,它也正在获取它们。如何区分搜索模式.sbs
和.sbsar
搜索模式?
您遇到的问题是 Win32 API 中搜索模式的限制。
具有恰好三个字符的文件扩展名(例如 *.txt)的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。
我的解决方案是使用 Linq 手动过滤结果:
nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
StringComparison.InvariantCultureIgnoreCase));
试试这个,使用文件扩展名过滤。
FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
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 文件名不区分大小写的事实。
如果性能是一个问题,也就是说,如果搜索必须处理包含大量文件的目录,那么执行两次过滤会更有效:一次在对GetFiles
or的调用中EnumerateFiles
,一次用于清理不需要的文件名。例如:
GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
它在文档中提到
在 searchPattern 中使用星号通配符时,文件扩展名恰好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件.