Swift - 如何修改像 kMDItemDisplayName 这样的文件元数据?

Swift - How to modify file metadata like kMDItemDisplayName?

我正在尝试找到一种方法来更改文件的元数据属性(前缀为 "kMDItem" 的元数据属性,由 mdls 列出),但我没有找到任何解决方案. ToT

起初,我试过使用 FileManager.default.setAttributes(_attributes:ofItemAtPath:),但这种方法只给我很少的选择,它只给我修改文件的 modification datecreation dateposix permissions等,不够

然后,我尝试使用 NSMetadataItemsetValue(_value:forKey:) 函数来更改元数据值,这是我的代码:

var attributes = NSMetadataItem(url: URL(fileURLWithPath: "/path/to/file")
if let metadata = attributes {
    metadata.setValue(newValue, forKey: kMDItemDisplayName as String)
    metadata.setValue(newValue, forKey: NSMetadataItemDisplayNameKey)
    // I've tried both of them from above (different keys), they both does not work at all
}

我注意到 setValue(_value:forKey:) 在这里没有执行任何操作,因为它反复收到此返回错误:error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

最后,我在 Whosebug 上红了 this post,这让我找到了这段代码:

_ = setxattr("/path/to/file".cString(using: .utf8), "kMDItemDisplayName", newValue.cString(using: .utf8), newValue.lengthOfBytes(using: .utf8), 0, 0)

执行后,我用mdlsxattr -l查看结果,我意识到这只是为文件添加扩展属性的解决方案,元数据没有改变,仅成功添加名称为 "kMDItemDisplayName" 的扩展属性。

结果不是我想要的(我只是用kMDItemDisplayName作为我的问题的例子),我不只是想找到一种方法来添加扩展属性到文件,而是一种编辑 mdls 列出的属性的方法。也许没有解决办法?或者也许我应该以完全不同的方式来做?

并非所有元数据都可以更改。其中大部分不是直接存储的,而是根据其他元数据派生或计算的。

简单文件的显示名称源自其在磁盘上的名称和系统设置,例如扩展名是隐藏还是显示。捆绑包(如应用程序)的显示名称稍微复杂一些,但是,假设您认为更改捆绑包的内容(这会破坏其代码签名)是不可接受的,则等价于同一件事。这些受制于系统语言。

还有一些文件夹的名称可以本地化以便显示,但这仍然基于它们在磁盘上的名称。

因此,要更改文件的显示名称,请更改其在磁盘上的实际名称。

对于其他属性,您可以查看URL.setResourceValues(_:)URLResourceValues 以了解哪些属性是可设置的。您还可以查看 URLResourceKey 以查看哪些记录为 "read-write".