1

我有一个NSArray包含我的应用程序的文档文件夹中存在的所有文件。

这是数组声明代码,

    NSArray * filePathsArray ;
    filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
    NSLog(@"Number of images in my app folder %d",[filePathsArray count]);

现在我想将名称以“snap”开头的文件复制(for ex: snap1 , snap2, snapRecent ...) 到另一个NSArray.

如何使用模式匹配来做到这一点?我是 iOS 开发的新手。

任何帮助将不胜感激。

4

5 回答 5

0

这是一种方法:

NSMutableArray *newArray = [NSMutableArray arrayWithCapacity: 5];
for (NSString *string in filePathsArray)
    if ([string rangeOfString: @"snap"].location == 0)
        [newArray addObject: string];

NSLog(@"%@", newArray);
于 2012-12-19T09:34:43.473 回答
0

您可以使用该方法- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate过滤与您的模式匹配的对象。例如,像下面这样的东西应该可以解决问题:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", predicateFilter];
NSArray *filteredArray = [filePathsArray filteredArrayUsingPredicate:predicate];
于 2012-12-19T09:23:16.330 回答
0

请注意,这subpathsOfDirectoryAtPath将对您的文件夹执行深度枚举(它还将搜索所有子文件夹)并将返回相对于基本文件夹的路径。为了在任何以 开头的文件夹中查找所有文件snap,您可以执行以下操作:

NSArray * filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath: documentsDirectory  error:nil];
NSIndexSet *indexes = [filePathsArray indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([[obj lastPathComponent] hasPrefix:@"snap"] && ![[[obj lastPathComponent] pathExtension] isEqualToString:@""]);
}];
NSArray *matches = [filePathsArray objectsAtIndexes:indexes];

现在matches数组将包含所有以snap不包括可能以 开头的文件夹snap)开头的文件的路径。路径将相对于您为枚举传递的目录。

于 2012-12-19T09:50:42.793 回答
0

下面的代码应该 hlp

NSString *startPattern = @"snap";
for (NSString *filePath in filePathsArray) {
    if (filePath.length < startPattern.length) {
        continue;
    }
    if ([[filePath substringToIndex:startPattern.length] isEqualToString:startPattern]) {
        // copy files
    }
}
于 2012-12-19T09:25:27.040 回答
0

如果您更喜欢正则表达式,请使用NSRegularExpression类。关联:

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html

下面的例子。

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^snap" options:0 error:&error];
//check for error here
NSMutableArray *filteredArray = [NSMutableArray array];

[filePathsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){

    NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:obj options:0 range:NSMakeRange(0, [obj length])];

    if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {

        [filteredArray addObject:obj];

    }

} ];
于 2012-12-19T09:40:53.257 回答