Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在目录树下找到文件的位置?_Macos_Appkit_Foundation - Fatal编程技术网

Macos 如何在目录树下找到文件的位置?

Macos 如何在目录树下找到文件的位置?,macos,appkit,foundation,Macos,Appkit,Foundation,给定一个文件名,比如说foo.txt和一个基本目录URL,比如说~/bar/directory找到文件第一次出现的子目录的最佳方法是什么 在基础或AppKIT中存在一个现有的API? 例如,通过子树进行广度优先搜索是一种可行的方法吗?那看起来怎么样 另一种方式 一个选项是手动枚举目录: func manualSearchFile(withName name: String, in path: String) { func search(url: URL) { do {

给定一个文件名,比如说foo.txt和一个基本目录URL,比如说~/bar/directory找到文件第一次出现的子目录的最佳方法是什么

  • 在基础或AppKIT中存在一个现有的API?
  • 例如,通过子树进行广度优先搜索是一种可行的方法吗?那看起来怎么样
  • 另一种方式

一个选项是手动枚举目录:

func manualSearchFile(withName name: String, in path: String) {

    func search(url: URL) {
        do {
            let contents = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: [.nameKey, .pathKey, .isDirectoryKey], options: [])
            try contents.forEach {
                let metadata = try $0.resourceValues(forKeys: [.nameKey, .pathKey, .isDirectoryKey])
                if metadata.name == name {
                    print("Manual Found: \(metadata.path ?? "unknown path")")
                }
                if metadata.isDirectory == true {
                    search(url: $0)
                }
            }
        } catch {
            print(error)
        }
    }

    search(url: URL(fileURLWithPath: path))
}
manualSearchFile(withName: "foo.txt", in: "/bar/directory")
另一种选择是使用Spotlight,它速度更快,但只适用于索引的路径。许多系统目录被排除在外,用户可以在系统首选项>聚光灯>隐私中排除更多目录

var metadataQuery: NSMetadataQuery?
func spotlightSearchFile(withName name: String, in path: String) {

    NotificationCenter.default.addObserver(forName: .NSMetadataQueryDidFinishGathering, object: nil, queue: nil) {

        guard let query = $0.object as? NSMetadataQuery else { return }
        query.enumerateResults { (result, index, cancel) in

            let item = result as? NSMetadataItem
            let path = item?.value(forAttribute: NSMetadataItemPathKey) as? String
            print("Spotlight Found: \(path ?? "unknown path")")
        }
    }

    metadataQuery = NSMetadataQuery()
    metadataQuery?.searchScopes = [path]
    metadataQuery?.predicate = NSPredicate(format: "%K like[cd] %@", NSMetadataItemDisplayNameKey, name)
    metadataQuery?.start()
}
spotlightSearchFile(withName: "foo.txt", in: "/bar/directory")
有关查询语法的更多信息,请参阅


在过去,我们使用
FSCatalogSearch
FSGetCatalogInfoBulk
有更多的选项。但是这些已经不可用了,好吧。

这是DFS解决方案,对吗?i、 e.将首先遍历目录直至其叶子,而不是在继续子目录之前搜索目录的所有内容。
NSFileManager.enumerate
函数也提供了什么?我对BFS更感兴趣,它更倾向于匹配文件而不是目录。我不确定,但——已经看过它运行了数百次——linux“find”看起来像BFS