Swift-如何修改文件元数据,例如kMDItemDisplayName?

时间:2019-02-16 05:07:38

标签: swift cocoa xattr mdls

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

起初,我尝试使用FileManager.default.setAttributes(_attributes:ofItemAtPath:),但是此方法只给了我很少的选择,它仅使我能够修改文件的modification datecreation date和{{1 }}等。

然后,我尝试将posix permissionsNSMetadataItem函数一起使用以更改元数据值,这是我的代码:

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列出的属性的方法。也许对此没有解决方案?还是我应该以完全不同的方式来做?

1 个答案:

答案 0 :(得分:1)

并非所有元数据都可以更改。它的很多不是直接存储,而是基于其他元数据导出或计算的。

简单文件的显示名称由其在磁盘上的名称和系统设置派生而来,例如扩展名是隐藏还是显示。捆绑软件(如应用程序)的显示名称稍微复杂一些,但是,假设您没有发现可以接受的改变捆绑软件的内容(这会破坏其代码签名),则等同于同一件事。这些受系统语言约束。

有些文件夹的名称可以本地化以显示,但是仍然基于其磁盘上的名称。

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

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