在 OS X Finder 中,有“注释”文件属性。可以通过添加“注释”列在查找器中检查它,也可以在右键单击文件或文件夹并选择“获取信息”后进行编辑/检查。
如何在 swift 或 Objective-C 中读取这个值?
我已经检查过 NSURL,但似乎没有一个是正确的
将各个部分放在一起(Ken Thomases 阅读上面的答案并编写答案链接),您可以使用带有 getter 和 setter 的计算属性来扩展 URL,以在文件中读取/写入注释:
更新:Xcode 8.2.1 • Swift 3.0.2
extension URL {
var finderComment: String? {
get {
guard isFileURL else { return nil }
return MDItemCopyAttribute(MDItemCreateWithURL(kCFAllocatorDefault, self as CFURL), kMDItemFinderComment) as? String
}
set {
guard isFileURL, let newValue = newValue else { return }
let script = "tell application \"Finder\"\n" +
String(format: "set filePath to \"%@\" as posix file \n", absoluteString) +
String(format: "set comment of (filePath as alias) to \"%@\" \n", newValue) +
"end tell"
guard let appleScript = NSAppleScript(source: script) else { return }
var error: NSDictionary?
appleScript.executeAndReturnError(&error)
if let error = error {
print(error[NSAppleScript.errorAppName] as! String)
print(error[NSAppleScript.errorBriefMessage] as! String)
print(error[NSAppleScript.errorMessage] as! String)
print(error[NSAppleScript.errorNumber] as! NSNumber)
print(error[NSAppleScript.errorRange] as! NSRange)
}
}
}
}
请勿使用低级扩展属性 API 读取 Spotlight 元数据。有一个合适的 Spotlight API 可以做到这一点。 (它被称为文件元数据 API。)这不仅令人头疼,而且无法保证 Apple 会继续使用相同的扩展属性来存储此信息。
使用
MDItemCreateWithURL()
为文件创建 MDItem
。使用 MDItemCopyAttribute()
和 kMDItemFinderComment
获取该项目的 Finder 评论。
正如 Mac OS X 的各种答案中所解释的:向任何文件添加自定义元数据字段, 可以使用
getxattr()
和 setxattr()
以编程方式读取和设置 Finder 注释。它们存储为扩展属性
“com.apple.metadata:kMDItemFinderComment”,该值是一个属性
列表。
这甚至适用于未由 Spotlight 索引的文件,例如网络服务器卷上的文件。
来自 Objective-C 代码这里 和 here 我做了这个简单的 Swift 函数 阅读 Finder 评论(现已针对 Swift 5 及更高版本进行更新):
func finderComment(url : URL) -> String? {
let XAFinderComment = "com.apple.metadata:kMDItemFinderComment"
return url.withUnsafeFileSystemRepresentation { fileSystemPath in
// Determine attribute size:
let length = getxattr(fileSystemPath, XAFinderComment, nil, 0, 0, 0)
guard length >= 0 else { return nil }
// Create buffer with required size:
var data = Data(count: length)
// Retrieve attribute:
let result = data.withUnsafeMutableBytes { [count = data.count] in
getxattr(fileSystemPath, XAFinderComment, $0.baseAddress, count, 0, 0)
}
guard result >= 0 else { return nil }
// Deserialize to String:
return try? PropertyListSerialization.propertyList(from: data,
options: [],
format: nil) as? String
}
}
使用示例:
let url = URL(fileURLWithPath: "/path/to/file")
if let comment = finderComment(url: url) {
print(comment)
}
该函数返回一个可选字符串,如果文件是
nil
没有 Finder 评论,或者检索时出现任何问题。