0

我试图找到一种方法来更改文件的元数据属性(那些前缀为“kMDItem”的,由 列出mdls),但我没有找到任何解决方案。时间

起初,我尝试过使用FileManager.default.setAttributes(_attributes:ofItemAtPath:),但这种方法只给了我几个选项,它只给了我修改文件的能力modification datecreation date等等posix permissions​​,这还不够。

然后,我尝试使用NSMetadataItemwithsetValue(_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)

最后,我在 StackOverflow 上红了这篇文章,这导致了我的这段代码:

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

执行后,我用mdlsandxattr -l查看结果,发现这只是给文件添加扩展属性的解决方案,元数据没有改变,只是成功添加了名称为“kMDItemDisplayName”的扩展属性。

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

4

1 回答 1

1

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

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

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

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

对于其他属性,您可以查看URL.setResourceValues(_:)URLResourceValues查看哪些属性是可设置的。您还可以URLResourceKey查看哪些记录为“读写”。

于 2019-02-16T08:14:03.147 回答