iOS: 使用匹配字符串来搜索文件夹内的路径_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > iOS: 使用匹配字符串来搜索文件夹内的路径

iOS: 使用匹配字符串来搜索文件夹内的路径

 2013/11/23 21:30:34  _Mgen  博客园  我要评论(0)
  • 摘要:在Windows的文件夹搜索中,可以使用”*”或者”?”这样的匹配符来搜索子文件路径。如下图: 在iOS中,可以使用NSPredicate格式符中的LIKE语句完成这样的筛选操作,注意NSPredicate格式符中的路径用%K,值用%@来表示(而且当%@占位符遇到字符串参数时,会自动为字符串加上引号)。所以可以定义一个函数,参数是要搜索的文件夹路径和匹配字符串,返回匹配的子路径。如下代码:NSArray*searchSubPaths(NSString*dir
  • 标签:搜索文件夹 使用 iOS 文件 字符串

在Windows的文件夹搜索中,可以使用”*”或者”?”这样的匹配符来搜索子文件路径。如下图:

image

 

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])

    {

        //使用NSPredicateevaluateWithObject

        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"

)

发表评论
用户名: 匿名