0

我想在 mac 目录中搜索具有 doc 扩展名的文件,就像我们使用搜索命令从 finder 中找到的一样。

我正在使用以下代码进行此搜索。但它只从下载目录中搜索。它不是从文档(查找器的文档目录,而不是应用程序)、桌面或主目录中的任何其他目录中搜索。

NSString *docsDir = NSHomeDirectory();
NSFileManager *localFileManager=[[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnum =
    [localFileManager enumeratorAtPath:docsDir];

NSString *file;
while ((file = [dirEnum nextObject])) {
    strPath = [NSString stringWithFormat:@"%@/",NSHomeDirectory()];

    strPath = [strPath stringByAppendingString:file];
    NSLog(@"%@",strPath);

    NSArray *dirFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:strPath error:nil];
    NSArray *pdfFiles = [dirFiles filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.pdf'"]];

    NSLog(@"%@",pdfFiles);
}

我试图改变路径

NSString *docsDir = [NSString stringWithFormat:@"/Users/%@/",NSUserName()];

NSString *docsDir = NSHomeDirectory();

但是,同样的事情发生了。

我想在所有目录中搜索具有特定扩展名的文件,就像我们从 finder 中搜索一样,如下图所示。在此处输入图像描述

4

2 回答 2

1

您的应用程序不是沙盒化的(您可以通过选择您的项目然后选择功能进行检查)?

我已经在它不起作用的沙盒应用程序和运行良好的非沙盒应用程序中运行了您的代码......

为什么它不在沙盒应用程序中运行?

  • 从沙盒应用程序中,您无法访问桌面等内容是规则,

  • 从沙盒应用程序中,您可以访问下载目录

enumeratorAtPath: 不遍历链接 - 在 Library/.../Data 目录中,您从 NSHomeDirectory() 获得的文档,Downloads 是一个链接,因此您只能访问您的 Download 文件夹的第一级。

  • @"/Users/%@/",NSUserName() 将为您提供您的“真实”用户文档目录,但由于您的应用程序是沙盒化的,因此您将无法枚举它。

看起来我的假设似乎几乎可以解释您观察到的所有症状。

于 2018-08-25T08:45:07.657 回答
0

要像 Finder 那样进行搜索,请使用 MSMetadataQuery。这是 Spotlight 背后的技术:

https://developer.apple.com/documentation/foundation/nsmetadataquery

至于沙盒,MetadataQuery 返回结果,然后您必须向用户询问读取这些文件的权限。

于 2018-08-27T08:40:40.817 回答