在Windows的文件夹搜索中,可以使用”*”或者”?”这样的匹配符来搜索子文件路径。如下图:
在iOS中,可以使用NSPredicate格式符中的LIKE语句完成这样的筛选操作,注意NSPredicate格式符中的路径用%K,值用%@来表示(而且当%@占位符遇到字符串参数时,会自动为字符串加上引号)。
所以可以定义一个函数,参数是要搜索的文件夹路径和匹配字符串,返回匹配的子路径。
如下代码:
NSArray* searchSubPaths(NSString *dir, NSString *pattern)
{
//子路径
NSArray *subPaths = [[NSFileManager defaultManager] subpathsAtPath:dir];
//创建NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE %@", @"lastPathComponent", pattern];
//筛选并返回结果
return [subPaths filteredArrayUsingPredicate:predicate];
}
使用举例,比如用它来搜索"/Users/MgenLiu/Desktop/ppt"文件夹内的所有以r开头的js文件,代码:
NSLog(@"%@", searchSubPaths(@"/Users/MgenLiu/Desktop/ppt", @"r*.js"));
输出举例:
(
"js/reveal.js",
"js/reveal.min.js",
"plugin/remotes/remotes.js"
)
不过,上面的函数虽然实现起来很方便,但是有两个问题,第一个问题是我们先通过NSFileManager的subpathsAtPath方法把所有路径存在一个数组中,然后才进行的筛选,完全没有必要。第二个问题,筛选后的路径是相对路径,不是完整路径。
所以可以把这个函数继续优化下,使用NSFileManager的enumeratorAtPath方法来枚举子路径,符合条件后,加入到结果数据中。因此这里无法使用NSPredicate的filteredArrayUsingPredicate方法,改用evaluateWithObject方法单独对对象进行判断。
代码:
NSArray* searchSubPaths(NSString *dir, NSString *pattern)
{
//准备枚举子路径
NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:dir];
NSString *file;
NSMutableArray *result = [NSMutableArray array];
//创建NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE %@", @"lastPathComponent", pattern];
//筛选并加入结果
while (file = [enumerator nextObject])
{
//使用NSPredicate的evaluateWithObject
if ([predicate evaluateWithObject:file])
{
[result addObject:[dir stringByAppendingPathComponent:file]];
}
}
return result;
}
输出举例:
(
"/Users/MgenLiu/Desktop/ppt/js/reveal.js",
"/Users/MgenLiu/Desktop/ppt/js/reveal.min.js",
"/Users/MgenLiu/Desktop/ppt/plugin/remotes/remotes.js"
)