gpt4 book ai didi

iphone - 使用 NSMetadataQuery 和 NSPredicate 返回目录列表

转载 作者:行者123 更新时间:2023-12-03 20:28:17 25 4
gpt4 key购买 nike

我正在尝试获取用户 iCloud 文件夹中的目录列表。我研究出了如何查找特殊类型的文件(例如 txt 文件),并且效果很好:

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
_query = query;

//Search all files in the Documents directories of the application’s iCloud container directories:
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K ENDSWITH '.txt'", NSMetadataItemFSNameKey];

[query setPredicate:pred];
[query startQuery];

但是,我现在尝试仅获取目录。我已阅读有关 NSPredicate 的文档,但我不知道如何寻找目录。我猜 NSPredicate 不是为此而设计的?我可以检查某个东西是否是这样的目录:

    BOOL isDir;
BOOL exists = [fm fileExistsAtPath:path isDirectory:&isDir];
if (exists) {
/* file exists */
if (isDir) {
/* file is a directory */
}
}

但是如何将其应用于 NSMetadataQuery,我不知道。如果我能得到任何帮助,我将不胜感激。

<小时/>

编辑:

我将谓词更改为 [NSPredicate predicateWithFormat:@"%K.pathExtension = ''", NSMetadataItemFSNameKey];

然后我确定查询何时完成,如下所示:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
[query startQuery];

- (void)queryDidFinishGathering:(NSNotification *)notification {

NSMetadataQuery *query = [notification object];
[query disableUpdates]; // You should invoke this method before iterating over query results that could change due to live updates.
[query stopQuery]; // You would call this function to stop a query that is generating too many results to be useful but still want to access the available results.

[self loadData:query];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query];
_query = nil; // we're done with it

}

最后,我进行了计数,但是无论我在云中拥有多少目录,这总是给我 0(我通过 Lion 和 Mobile Documents 文件夹检查了这一点;例如,我有 Documents/myTXTs 等)。这很奇怪。如果我对文本文件进行计数,它会给出 4,因为我有 4 个 txt 文件。所以我猜我的目录没有被计算在内:

 - (void)loadData:(NSMetadataQuery *)query {

NSLog(@"Query count %i", [query resultCount]);

...

最佳答案

我尝试过 EmptyStack 的答案,但没有成功......

我发现NSMetadataQuery找不到目录,问题不是NSPredicate从结果中过滤目录,问题是只是查询找不到文件夹。我尝试使用调试器,发现找到的所有 LBItem 都是常规文件而不是目录。我希望苹果将来能改进这一点。 也许在 MountainLion 中这更好,因为他们似乎有文件夹支持......哎呀,当然你没有在这里读到这篇文章,因为它仍然是保密协议(protocol)。算了

但是至少有一种解决此问题的方法:

例如,如果您的文件结构是;

|_Folder
| |_file
| |_file2
|_Folder1
| |_file
|_file

我们用谓词进行查询:

predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey

结果将是(使用NSMetadataItemURLKey获取URL)

path/to/iCloud/Documents/Folder/file
path/to/iCloud/Documents/Folder/file2
path/to/iCloud/Documents/Folder1/file
path/to/iCloud/Documents/file

我们需要做的是自己过滤这些结果,方法是查看每个 URL 的组成部分数量并根据需要截取 URL。第一级的项目应该有 numberOfComponentsOfUbiquitousContainer + 1,下一级甚至会有一个,依此类推。我们也需要丢弃重复项(或者像本示例中一样,我们将获得 Folder 两次)。

可能不是最佳的,但对我有用,

更新:

最好使用下面的谓词,它会减少爬网子文件夹时的查询结果。

// dirPath is an NSString path of the directory you want
// to look at. Usually, for the top level directory:
// [NSFileManager URLForUbiquityContainerIdentifier:nil].path;
predicateWithFormat:@"%K BEGINSWITH %@", NSMetadataItemPathKey, dirPath];

关于iphone - 使用 NSMetadataQuery 和 NSPredicate 返回目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7873974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com