我正在尝试找到一种方法来更改文件的元数据属性(前缀为“ kMDItem”的文件,由mdls
列出),但是我没有找到任何解决方案。 ToT
起初,我尝试使用FileManager.default.setAttributes(_attributes:ofItemAtPath:)
,但是此方法只给了我很少的选择,它仅使我能够修改文件的modification date
,creation date
和{{1 }}等。
然后,我尝试将posix permissions
与NSMetadataItem
函数一起使用以更改元数据值,这是我的代码:
setValue(_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:)
。
最后,我在StackOverflow上加了this post,这导致了我的代码:
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
执行它之后,我使用_ = setxattr("/path/to/file".cString(using: .utf8), "kMDItemDisplayName", newValue.cString(using: .utf8), newValue.lengthOfBytes(using: .utf8), 0, 0)
和mdls
来检查结果,我意识到这只是将扩展属性添加到文件的解决方案,元数据没有改变,只有已成功添加名称为“ kMDItemDisplayName”的扩展属性。
结果不是我想要的(我只是使用kMDItemDisplayName作为我的问题的示例),我不仅想找到一种向文件添加扩展属性的方法,还可以一种编辑xattr -l
列出的属性的方法。也许对此没有解决方案?还是我应该以完全不同的方式来做?
答案 0 :(得分:1)
并非所有元数据都可以更改。它的很多不是直接存储,而是基于其他元数据导出或计算的。
简单文件的显示名称由其在磁盘上的名称和系统设置派生而来,例如扩展名是隐藏还是显示。捆绑软件(如应用程序)的显示名称稍微复杂一些,但是,假设您没有发现可以接受的改变捆绑软件的内容(这会破坏其代码签名),则等同于同一件事。这些受系统语言约束。
有些文件夹的名称可以本地化以显示,但是仍然基于其磁盘上的名称。
因此,要更改文件的显示名称,请在磁盘上更改其实际名称。
对于其他属性,您可以查看URL.setResourceValues(_:)
和URLResourceValues
来查看哪些属性是可设置的。您也可以查看URLResourceKey
来查看哪些记录为“读写”。