Swift - 如何修改像 kMDItemDisplayName 这样的文件元数据?
Swift - How to modify file metadata like kMDItemDisplayName?
我正在尝试找到一种方法来更改文件的元数据属性(前缀为 "kMDItem" 的元数据属性,由 mdls
列出),但我没有找到任何解决方案. ToT
起初,我试过使用 FileManager.default.setAttributes(_attributes:ofItemAtPath:)
,但这种方法只给我很少的选择,它只给我修改文件的 modification date
、creation date
和 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:)
在这里没有执行任何操作,因为它反复收到此返回错误: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)
执行后,我用mdls
和xattr -l
查看结果,我意识到这只是为文件添加扩展属性的解决方案,元数据没有改变,仅成功添加名称为 "kMDItemDisplayName" 的扩展属性。
结果不是我想要的(我只是用kMDItemDisplayName作为我的问题的例子),我不只是想找到一种方法来添加扩展属性到文件,而是一种编辑 mdls
列出的属性的方法。也许没有解决办法?或者也许我应该以完全不同的方式来做?
并非所有元数据都可以更改。其中大部分不是直接存储的,而是根据其他元数据派生或计算的。
简单文件的显示名称源自其在磁盘上的名称和系统设置,例如扩展名是隐藏还是显示。捆绑包(如应用程序)的显示名称稍微复杂一些,但是,假设您认为更改捆绑包的内容(这会破坏其代码签名)是不可接受的,则等价于同一件事。这些受制于系统语言。
还有一些文件夹的名称可以本地化以便显示,但这仍然基于它们在磁盘上的名称。
因此,要更改文件的显示名称,请更改其在磁盘上的实际名称。
对于其他属性,您可以查看URL.setResourceValues(_:)
和URLResourceValues
以了解哪些属性是可设置的。您还可以查看 URLResourceKey
以查看哪些记录为 "read-write".
我正在尝试找到一种方法来更改文件的元数据属性(前缀为 "kMDItem" 的元数据属性,由 mdls
列出),但我没有找到任何解决方案. ToT
起初,我试过使用 FileManager.default.setAttributes(_attributes:ofItemAtPath:)
,但这种方法只给我很少的选择,它只给我修改文件的 modification date
、creation date
和 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:)
在这里没有执行任何操作,因为它反复收到此返回错误: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)
执行后,我用mdls
和xattr -l
查看结果,我意识到这只是为文件添加扩展属性的解决方案,元数据没有改变,仅成功添加名称为 "kMDItemDisplayName" 的扩展属性。
结果不是我想要的(我只是用kMDItemDisplayName作为我的问题的例子),我不只是想找到一种方法来添加扩展属性到文件,而是一种编辑 mdls
列出的属性的方法。也许没有解决办法?或者也许我应该以完全不同的方式来做?
并非所有元数据都可以更改。其中大部分不是直接存储的,而是根据其他元数据派生或计算的。
简单文件的显示名称源自其在磁盘上的名称和系统设置,例如扩展名是隐藏还是显示。捆绑包(如应用程序)的显示名称稍微复杂一些,但是,假设您认为更改捆绑包的内容(这会破坏其代码签名)是不可接受的,则等价于同一件事。这些受制于系统语言。
还有一些文件夹的名称可以本地化以便显示,但这仍然基于它们在磁盘上的名称。
因此,要更改文件的显示名称,请更改其在磁盘上的实际名称。
对于其他属性,您可以查看URL.setResourceValues(_:)
和URLResourceValues
以了解哪些属性是可设置的。您还可以查看 URLResourceKey
以查看哪些记录为 "read-write".