Ios NSMetadataQuery按文件夹分类

Ios NSMetadataQuery按文件夹分类,ios,swift,Ios,Swift,我正在执行NSMetadataQuery,并获取文件和目录的所有URL func initSearchQuery(){ print("\(logClassName): initSearchQuery") searchQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope] let searchPredicate = NSPredicate.init(format: "%K like '*'", arg

我正在执行NSMetadataQuery,并获取文件和目录的所有URL

func initSearchQuery(){
    print("\(logClassName): initSearchQuery")

    searchQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

    let searchPredicate = NSPredicate.init(format: "%K like '*'", argumentArray: [NSMetadataItemFSNameKey])
    searchQuery.predicate = searchPredicate

    NotificationCenter.default.addObserver(self, selector: #selector(updateDataWithNotification), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: searchQuery)

    NotificationCenter.default.addObserver(self, selector: #selector(updateDataWithNotification), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: searchQuery)

    searchQuery.enableUpdates()
    searchQuery.start()

}

有没有办法做一个谓词,只给出目录的URL?

经过一些研究,我终于解决了我的问题

假设我们有iCloud文件夹的路径

var iCloudUrl = fileManager.url(forUbiquityContainerIdentifier: nil)
iCloudUrl = iCloudUrl.appendingPathComponent("Documents")
现在我们要在iCloud Documents文件夹中对folder1执行NSMetadataQuery

我们可以通过如下方式声明NSPredicate来访问内容:

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path])
它将返回文件夹、文件和子文件夹的所有URL

1) 如果我们只想获取文件,那么NSPredicate将是这样的

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && NOT %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])
2) 如果我们想计算它有多少文件夹和子文件夹,那么

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])

经过一些研究,我终于解决了我的问题

假设我们有iCloud文件夹的路径

var iCloudUrl = fileManager.url(forUbiquityContainerIdentifier: nil)
iCloudUrl = iCloudUrl.appendingPathComponent("Documents")
现在我们要在iCloud Documents文件夹中对folder1执行NSMetadataQuery

我们可以通过如下方式声明NSPredicate来访问内容:

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path])
它将返回文件夹、文件和子文件夹的所有URL

1) 如果我们只想获取文件,那么NSPredicate将是这样的

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && NOT %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])
2) 如果我们想计算它有多少文件夹和子文件夹,那么

let searchPredicate = NSPredicate.init(format: "%K BEGINSWITH %@ && %K.pathExtension = ''", argumentArray: [NSMetadataItemPathKey,iCloudUrl.appendingPathComponent("Folder1").path,NSMetadataItemFSNameKey])

您好,我正在使用您的解决方案,但不幸的是,查询似乎无法通过。我想查询iCloud驱动器文件夹中的文件。路径&NSPredicate是:guard let containerURL=FileManager.default.url(forUbiquityContainerIdentifier:nil)?.appendingPathComponent(“文档”)else{return}query.predicate=NSPredicate.init(格式:“%K BEGINSWITH%@”,参数数组:[NSMetadataItemPathKey,containerURL.path])然后,我使用以下命令开始查询:=self?.query.start()self?.query.enableUpdates()您好,我正在使用您的解决方案,但不幸的是,查询似乎无法完成。我想查询iCloud驱动器文件夹中的文件。路径&NSPredicate是:guard let containerURL=FileManager.default.url(forUbiquityContainerIdentifier:nil)?.appendingPathComponent(“文档”)else{return}query.predicate=NSPredicate.init(格式:“%K BEGINSWITH%@”,参数数组:[NSMetadataItemPathKey,containerURL.path])然后,我使用以下命令启动查询:=self?.query.start()self?.query.enableUpdates()