Macos 如何在目录树下找到文件的位置?
给定一个文件名,比如说foo.txt和一个基本目录URL,比如说~/bar/directory找到文件第一次出现的子目录的最佳方法是什么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 {
- 在基础或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