使用 NSPredicate 过滤 NSFileManger 内容以获取文件“模式”列表
Posted
技术标签:
【中文标题】使用 NSPredicate 过滤 NSFileManger 内容以获取文件“模式”列表【英文标题】:Filter NSFileManger contents for a list of file 'patterns' using NSPredicate 【发布时间】:2013-07-29 06:24:01 【问题描述】:我有一个字符串数组用作“过滤器”:
@[@"*.png", @".DS_Store", @"Foobar", @".jpg"]
如何使用上述模式通过 NSPredicate 过滤掉文件夹的所有内容?
这是我目前所得到的:
NSArray *contents = [fileManager contentsOfDirectoryAtPath:fullPath error:NULL];
NSArray *filter = @[@"*.png", @".DS_Store", @"Foobar", @".jpg"];
NSArray *contents = [contents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"((pathExtension IN[cd] %@) OR (lastPathComponent IN[cd] %@)) ", filter, filter]];
但这并没有给我想要的结果。例如,png
文件不会被过滤。另外,我不能让它不区分大小写,所以foobar
不会被过滤掉。
【问题讨论】:
【参考方案1】:看看Predicate Programming Guide
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/Users/new/Desktop/" error:nil];
NSArray *extensions = [NSArray arrayWithObjects:@"jpg", @"png",nil];
NSArray *files = [contents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(pathExtension IN %@) AND !(self LIKE[c] %@)", extensions, @"Foobar"]];
//[c] for case insensitive
【讨论】:
【参考方案2】:您可以过滤您想要列出的内容。剩余的将自动过滤。
-(void)filter
localSongs=[[NSMutableArray alloc]init];
NSArray * paths = NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
NSDirectoryEnumerator *de = [[NSFileManager defaultManager] enumeratorAtPath:documentsDirectory] ;
NSString *file;
while ((file = [de nextObject]))
if (([[file pathExtension] isEqualToString:@"MP3"]) || ([[file pathExtension]isEqualToString:@"mp4"]) || ([[file pathExtension]isEqualToString:@"mp3"]) || ([[file pathExtension]isEqualToString:@"mov"]) || ([[file pathExtension]isEqualToString:@"avi"]) )
[localSongs addObject:file.lastPathComponent];
NSLog(@"local files%@",localSongs);
【讨论】:
以上是关于使用 NSPredicate 过滤 NSFileManger 内容以获取文件“模式”列表的主要内容,如果未能解决你的问题,请参考以下文章