【问题标题】:Can someone explain what URLResourceKeys are?有人能解释一下 URLResource Keys 是什么吗?
【发布时间】:2018-10-02 17:33:21
【问题描述】:

我正在查看contentsOfDirectory(at:includingPropertiesForKeys:options:) 的文档

特别是我一直关注includingPropertiesForKeys的论点,它说:

标识要为目录中的每个项目预取的文件属性的键数组。对于每个返回的 URL,指定的属性被获取并缓存在 NSURL 对象中。有关您可以指定的键的列表,请参阅通用文件系统资源键。

点击URLResourceKey 将我引导至有关它的 Apple 文档。

我想知道,如果我传递了 fileResourceTypeKeyfileResourceIdentifierKeycreationDateKey 之类的键,我如何访问返回的 URL 列表中的那些(在调用 contentsOfDirectory(at:includingPropertiesForKeys:options:) 之后)?

我也对URLResourceKey enum b/c 感到困惑,很多类型的描述和名称与其他键类似:

  • documentIdentifierKey vs fileResourceIdentifierKeyvs localizedNameKey vs nameKey
  • localizedTypeDescriptionKey vs fileResourceTypeKey vs typeIdentifierKey
  • contentsOfDirectory(at:includingPropertiesForKeys:options:)pathKey 返回的 url

这些键之间有什么区别?

基本上我此时对文件系统的了解非常低,所以请耐心等待我的“简单”问题。如果有人能解释所有这些键的含义以及我如何访问/使用它们,那就太好了!

【问题讨论】:

标签: swift nsfilemanager


【解决方案1】:

首先URLResourceKey 文档很好地描述了属性信息的种类。例如,nameKey 始终为表示 ~/Desktop 的 URL 返回 Desktop,而 localizedNameKey 在德语系统上返回本地化名称 Schreibtisch,在法语系统上返回 Bureau。但是documentIdentifierKeyfileResourceIdentifierKey 是完全不同的属性。


关于contentsOfDirectory(at:includingPropertiesForKeys:options:) API:includingPropertiesForKeys 参数中传递的键告诉框架在获取内容时出于性能原因预取相应的属性。例如

let contentURLs = try fileManager.contentsOfDirectory(at: anURL, includingPropertiesForKeys: [.nameKey, .fileSizeKey], options: .skipsHiddenFiles)

要读取 URL 上的属性调用 resourceValues(forKeys,传递与 contentsOfDirectory 中相同的键。然后获取资源键对应属性的值。 URLResourceKey / URLResourceValues 组合的好处是您始终可以从文件属性中获得正确的类型。这避免了任何类型转换。

for fileURL in contentURLs {
     do {
        let fileAttributes = try fileURL.resourceValues(forKeys:[.nameKey, .fileSizeKey])
        print(fileAttributes.name!) // is String
        print(fileAttributes.fileSize!) // is Int
     } catch { print(error, fileURL) }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多