使用 NSMetadataQuery 在目录中搜索文件
Posted
技术标签:
【中文标题】使用 NSMetadataQuery 在目录中搜索文件【英文标题】:Searching for files inside a directory using NSMetadataQuery 【发布时间】:2013-05-01 20:45:03 【问题描述】:我的应用程序正在使用 UIDocument + iCloud 创建和查看文档。文件以这种方式存储:
文档/文件名.db Documents/Filename.db/File.db(Filename.db 是目录)Documents/Filename.db 目录中的文件可以在其自己的视图控制器中正常加载。在另一个视图控制器中打开 Documents/Filename.db/File.db 时,我在加载这些文件时遇到问题。 文件名不是固定的,而且会多次出现。我可以验证文件是否存储在目录中,所以这应该不是问题。
我想我已经找到了 NSMetadataQuery 的问题,因为它只在 Documents/ 中搜索 - 我希望它在 Documents/Filename.db 目录中搜索。我尝试将查询 serachScope 设置为正确的路径,但似乎我需要使用 NSMetadataQueryUbiquityContainerDocumentsScope 进行搜索以返回结果。
- (NSMetadataQuery *)documentQuery
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
NSString *appending = [NSString stringWithFormat:@"Documents/%@.db/", currentDirectory]; // Directory name
NSURL *documentPath = [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] URLByAppendingPathComponent:appending];
NSLog(@"Document Path: %@", documentPath);
if (query)
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
NSString *filePattern = [NSString stringWithFormat:@"*.%@", STACK_EXTENSION];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]];
return query;
- (void)processiCloudFiles:(NSNotification *)notification
[_query disableUpdates];
[_iCloudURLs removeAllObjects];
NSArray *queryResults = [_query results];
for (NSMetadataItem *result in queryResults)
NSURL *fileURL = [result valueForAttribute:NSMetadataItemURLKey];
NSLog(@"---- FileURL: %@", fileURL);
NSNumber *aBool = nil;
[fileURL getResourceValue:&aBool forKey:NSURLIsHiddenKey error:nil];
if (aBool && ![aBool boolValue])
NSLog(@"Adding following Stack: %@", fileURL);
[_iCloudURLs addObject:fileURL];
NSLog(@"Found %d iCloud files", _iCloudURLs.count);
NSLog(@"iCloud URLs: %@", _iCloudURLs);
...
【问题讨论】:
【参考方案1】:我不确定为什么您的目录具有 .db 扩展名,而且我可能不理解您问题的全部含义,但是当我询问有关在 iCloud 存储的 ubiquity 容器中使用子目录时,有人告诉我,我相信是一位 Apple 工程师,他说可以添加子目录,但是“任何目录都不应该在其名称中包含 . ,否则它们可能会被视为一个包,这对您来说将是可悲的结局。此外,您不应将任何 .nosync 条目放在容器。”他还说“设置会将文档显示为平面层次结构(例如,它只会显示文件和包,而不是目录),其他 UI 区域也可能在视觉上忽略子目录。”
为了从目录主表中选择子目录中的文件详细表,我采用了一种方法来遍历查询中的所有项目并仅查找在 URL 中具有子目录的项目。
【讨论】:
以上是关于使用 NSMetadataQuery 在目录中搜索文件的主要内容,如果未能解决你的问题,请参考以下文章
如何限制从 NSMetadataQuery 返回的结果数量?
为啥检查 [NSMetadataQuery 类] 在 iOS 4.2.1 上崩溃?
两个 iCloud 设备使用 NSMetaDataQuery 得到不同的结果