如何在Mac的主目录中搜索具有特定扩展名的文件?

时间:2018-08-24 09:17:20

标签: objective-c macos cocoa nsfilemanager nshomedirectory

我想在Mac目录中搜索具有doc扩展名的文件,这与使用搜索命令从finder中查找到的文件相同。

我正在使用以下代码进行此搜索。但是它仅从下载目录中搜索。它不是从Document(查找程序的Document目录,不是应用程序),Desktop或Home目录中的任何其他目录中搜索。

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中搜索一样,如下图所示。enter image description here

2 个答案:

答案 0 :(得分:1)

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

我已经在无法运行的沙盒应用程序和无法正常运行的非沙盒应用程序中运行代码...

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

  • 从沙盒应用程序开始的规则是,您不能访问桌面等内容。

  • 通过沙盒应用程序,您可以访问“下载”目录

但是

enumeratorAtPath:不遍历链接-且在Library /.../ Data目录中,您从NSHomeDirectory()获得的文档,下载是链接,因此您将只能访问“下载”文件夹的第一级

  • @“ / Users /%@ /”,NSUserName()将为您提供“真实的”用户文档目录,但是当您的应用被沙箱化时,您将无法通过它枚举。

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

答案 1 :(得分:0)

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

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

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