如何读取文件注释字段

问题描述 投票:0回答:3

在 OS X Finder 中,有“注释”文件属性。可以通过添加“注释”列在查找器中检查它,也可以在右键单击文件或文件夹并选择“获取信息”后进行编辑/检查。

如何在 swift 或 Objective-C 中读取这个值?

我已经检查过 NSURL,但似乎没有一个是正确的

objective-c swift macos
3个回答
6
投票

将各个部分放在一起(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)
            }
        }
    }
}

5
投票

请勿使用低级扩展属性 API 读取 Spotlight 元数据。有一个合适的 Spotlight API 可以做到这一点。 (它被称为文件元数据 API。)这不仅令人头疼,而且无法保证 Apple 会继续使用相同的扩展属性来存储此信息。

使用

MDItemCreateWithURL()
为文件创建
MDItem
。使用
MDItemCopyAttribute()
kMDItemFinderComment
获取该项目的 Finder 评论。


3
投票

正如 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 评论,或者检索时出现任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.