我使用以下行返回特定文件...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
但是目录中还有其他文件扩展名为“.sbsar”,而且它们也正在获取它们。如何在搜索模式中区分“.sbs”和“.sbsar”?
答案 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,文件扩展名正好为三个字符 返回扩展名为三个或更多字符的文件 使用问号通配符,此方法仅返回 与指定文件扩展名匹配的文件。