如何访问 Swift 中 NSMetadataItem 的文本内容 (kMDItemTextContent)?
How can I access the text content (kMDItemTextContent) of an NSMetadataItem in Swift?
我正在尝试使用 Swift 访问 NSMetadataQuery
结果的文本表示。但是,结果中不存在包含文件文本表示的属性 kMDItemTextContent
。我可以确认该属性应该存在,因为使用该属性搜索文件可以完美运行。
到目前为止,这是我的代码:
import Foundation
import Cocoa
class Indexer {
public let spotlight = NSMetadataQuery()
let backgroundQueue = OperationQueue()
init() {
let nc = NotificationCenter.default
spotlight.searchScopes = []
spotlight.predicate = NSPredicate(fromMetadataQueryString: "kMDItemKind == *")
nc.addObserver(forName: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil, queue: self.backgroundQueue, using:{_ in
self.spotlight.disableUpdates()
for i in 0..<self.spotlight.resultCount {
let result = self.spotlight.result(at: i) as! NSMetadataItem
print("----- \(result.value(forAttribute: "kMDItemDisplayName") ?? "No title") -----")
for attribute in result.attributes {
print("\(attribute):", result.value(forAttribute: attribute) ?? "No content")
}
}
self.spotlight.enableUpdates()
})
spotlight.start()
}
}
一个文件的当前结果如下所示:
----- n26-csv-transactions.csv -----
kMDItemContentTypeTree: (
"public.comma-separated-values-text",
"public.data",
"public.delimited-values-text",
"public.plain-text",
"public.item",
"public.content",
"public.text"
)
kMDItemContentType: public.comma-separated-values-text
kMDItemPhysicalSize: 16384
kMDItemDisplayName: n26-csv-transactions.csv
kMDItemKind: CSV Document
kMDItemContentCreationDate: 2019-04-25 17:09:08 +0000
kMDItemContentCreationDate_Ranking: 2019-04-25 00:00:00 +0000
kMDItemContentModificationDate: 2019-04-25 17:09:08 +0000
kMDItemInterestingDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUsedDates: (
"2019-05-07 22:00:00 +0000"
)
kMDItemLastUsedDate: 2019-05-08 10:00:33 +0000
kMDItemLastUsedDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUseCount: 3
kMDItemLogicalSize: 591
kMDItemWhereFroms: (
"https://app.n26.com/download-csv",
"https://app.n26.com/downloads"
)
kMDItemFSName: n26-csv-transactions.csv
kMDItemFSSize: 591
kMDItemFSCreationDate: 2019-04-25 17:09:08 +0000
kMDItemFSContentChangeDate: 2019-04-25 17:09:08 +0000
kMDItemFSOwnerUserID: 99
kMDItemFSOwnerGroupID: 99
kMDItemFSNodeCount: No content
kMDItemFSInvisible: 0
kMDItemFSTypeCode: 0
kMDItemFSCreatorCode: 0
kMDItemFSFinderFlags: 0
kMDItemFSHasCustomIcon: No content
kMDItemFSIsExtensionHidden: 0
kMDItemFSIsStationery: No content
kMDItemFSLabel: 0
此处似乎缺少 kMDItemTextContent
属性。
有没有办法使用 Spotlight 返回的 NSMetadataItem
访问该属性?如果没有,是否有另一种方法来访问文件的文本表示形式?
Is there a way to access that attribute using the NSMetadataItems returned by Spotlight? If not, is there another way to access a file's text representation?
一句话:没有。阅读该属性的 docs:
Contains a text representation of the content of the document. Data in multiple fields should be combined using a whitespace character as a separator. An application's Spotlight importer provides the content of this attribute.
Applications can create queries using this attribute, but are not able to read the value of this attribute directly. [Emphasis mine.]
文本内容信息进入 Spotlight 索引,因此,如您所见,您可以在其上进行搜索。但是你不能以任何方式为自己获得它。它不以任何 public programmer-facing 形式存在。
(举个例子,现有的 mdls
命令基本上就是你的代码所做的 - 你可以通过 运行 mdls
在进程中省去麻烦。嗯,如果您在终端中输入 mdls
命令,您将不会在属性中看到 kMDItemTextContent
,即使此文件的内容已编入索引。)
要了解这是为什么,请考虑一下隐私。如果您仅仅因为可以访问 Spotlight 就可以阅读用户计算机上每个文件的文本表示,那么您就会知道用户计算机上的所有数据。除非你是某种邪恶的黑客,否则你甚至不应该想要那样。要找出文件中的内容,打开 文件 — 如果可以的话。
那么这个属性到底有什么用呢?这样您就可以通过自定义 Spotlight 导入程序以属于您的文件类型将文本 提供给 Spotlight。
我正在尝试使用 Swift 访问 NSMetadataQuery
结果的文本表示。但是,结果中不存在包含文件文本表示的属性 kMDItemTextContent
。我可以确认该属性应该存在,因为使用该属性搜索文件可以完美运行。
到目前为止,这是我的代码:
import Foundation
import Cocoa
class Indexer {
public let spotlight = NSMetadataQuery()
let backgroundQueue = OperationQueue()
init() {
let nc = NotificationCenter.default
spotlight.searchScopes = []
spotlight.predicate = NSPredicate(fromMetadataQueryString: "kMDItemKind == *")
nc.addObserver(forName: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil, queue: self.backgroundQueue, using:{_ in
self.spotlight.disableUpdates()
for i in 0..<self.spotlight.resultCount {
let result = self.spotlight.result(at: i) as! NSMetadataItem
print("----- \(result.value(forAttribute: "kMDItemDisplayName") ?? "No title") -----")
for attribute in result.attributes {
print("\(attribute):", result.value(forAttribute: attribute) ?? "No content")
}
}
self.spotlight.enableUpdates()
})
spotlight.start()
}
}
一个文件的当前结果如下所示:
----- n26-csv-transactions.csv -----
kMDItemContentTypeTree: (
"public.comma-separated-values-text",
"public.data",
"public.delimited-values-text",
"public.plain-text",
"public.item",
"public.content",
"public.text"
)
kMDItemContentType: public.comma-separated-values-text
kMDItemPhysicalSize: 16384
kMDItemDisplayName: n26-csv-transactions.csv
kMDItemKind: CSV Document
kMDItemContentCreationDate: 2019-04-25 17:09:08 +0000
kMDItemContentCreationDate_Ranking: 2019-04-25 00:00:00 +0000
kMDItemContentModificationDate: 2019-04-25 17:09:08 +0000
kMDItemInterestingDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUsedDates: (
"2019-05-07 22:00:00 +0000"
)
kMDItemLastUsedDate: 2019-05-08 10:00:33 +0000
kMDItemLastUsedDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUseCount: 3
kMDItemLogicalSize: 591
kMDItemWhereFroms: (
"https://app.n26.com/download-csv",
"https://app.n26.com/downloads"
)
kMDItemFSName: n26-csv-transactions.csv
kMDItemFSSize: 591
kMDItemFSCreationDate: 2019-04-25 17:09:08 +0000
kMDItemFSContentChangeDate: 2019-04-25 17:09:08 +0000
kMDItemFSOwnerUserID: 99
kMDItemFSOwnerGroupID: 99
kMDItemFSNodeCount: No content
kMDItemFSInvisible: 0
kMDItemFSTypeCode: 0
kMDItemFSCreatorCode: 0
kMDItemFSFinderFlags: 0
kMDItemFSHasCustomIcon: No content
kMDItemFSIsExtensionHidden: 0
kMDItemFSIsStationery: No content
kMDItemFSLabel: 0
此处似乎缺少 kMDItemTextContent
属性。
有没有办法使用 Spotlight 返回的 NSMetadataItem
访问该属性?如果没有,是否有另一种方法来访问文件的文本表示形式?
Is there a way to access that attribute using the NSMetadataItems returned by Spotlight? If not, is there another way to access a file's text representation?
一句话:没有。阅读该属性的 docs:
Contains a text representation of the content of the document. Data in multiple fields should be combined using a whitespace character as a separator. An application's Spotlight importer provides the content of this attribute. Applications can create queries using this attribute, but are not able to read the value of this attribute directly. [Emphasis mine.]
文本内容信息进入 Spotlight 索引,因此,如您所见,您可以在其上进行搜索。但是你不能以任何方式为自己获得它。它不以任何 public programmer-facing 形式存在。
(举个例子,现有的 mdls
命令基本上就是你的代码所做的 - 你可以通过 运行 mdls
在进程中省去麻烦。嗯,如果您在终端中输入 mdls
命令,您将不会在属性中看到 kMDItemTextContent
,即使此文件的内容已编入索引。)
要了解这是为什么,请考虑一下隐私。如果您仅仅因为可以访问 Spotlight 就可以阅读用户计算机上每个文件的文本表示,那么您就会知道用户计算机上的所有数据。除非你是某种邪恶的黑客,否则你甚至不应该想要那样。要找出文件中的内容,打开 文件 — 如果可以的话。
那么这个属性到底有什么用呢?这样您就可以通过自定义 Spotlight 导入程序以属于您的文件类型将文本 提供给 Spotlight。