请求解释URLResourceKeys及contentsOfDirectory方法参数相关疑问
嘿,我来给你把URLResourceKeys的事儿说清楚,还有它在contentsOfDirectory(at:includingPropertiesForKeys:options:)方法里的作用~
1. 什么是URLResourceKeys?
简单说,URLResourceKey是Foundation框架里定义的一组文件系统元数据键,每个键对应文件/目录的一个特定属性。比如你想知道一个文件的大小、创建时间,或者判断某个URL指向的是不是目录,这些都有对应的URLResourceKey可以用。
这些键本质上是URLResourceKey结构体的静态属性,用来标识你想要获取的文件系统资源属性,系统会根据这些键去读取对应的元数据。
2. 为什么在contentsOfDirectory里要用到它?
你看的这个方法contentsOfDirectory(...),默认情况下返回的只是目录里每个条目的URL路径,并没有附带任何文件属性。如果你后续想获取每个条目的属性(比如调用resourceValues(forKeys:)),每次调用都会单独访问一次文件系统——如果目录里有几百个文件,这就会非常慢。
而includingPropertiesForKeys参数的作用,就是让系统提前批量获取所有条目的指定属性,并把这些属性缓存到返回的URL对象里。后续你再读取这些属性时,直接从缓存里拿就行,不用再去访问文件系统,效率提升特别明显。
3. 常用的URLResourceKeys有哪些?
给你列几个日常开发里高频用到的:
isDirectoryKey:判断该URL指向的是否是目录fileSizeKey:获取文件的字节大小creationDateKey:文件/目录的创建时间contentModificationDateKey:文件/目录的最后修改时间localizedNameKey:文件/目录的本地化显示名称
4. 实际使用示例
给你写个简单的Swift代码例子,演示怎么用这个参数预获取属性:
let targetDirectory = URL(fileURLWithPath: "/Users/you/Documents") do { // 指定要预获取的属性键 let prefetchKeys: [URLResourceKey] = [.isDirectoryKey, .fileSizeKey] let directoryItems = try FileManager.default.contentsOfDirectory( at: targetDirectory, includingPropertiesForKeys: prefetchKeys, options: [] ) // 遍历每个条目,从缓存读取属性 for itemURL in directoryItems { let resourceValues = try itemURL.resourceValues(forKeys: Set(prefetchKeys)) // 判断是否是目录 if let isDir = resourceValues.isDirectory { print("\(itemURL.lastPathComponent) → 是目录:\(isDir)") } // 获取文件大小(目录的话size可能为nil) if let size = resourceValues.fileSize { print("\(itemURL.lastPathComponent) → 大小:\(size) 字节") } } } catch { print("读取目录出错:\(error.localizedDescription)") }
如果不需要预获取任何属性,直接传空数组[]就行,这时候返回的URL只有路径信息,适合目录条目很少的场景。
内容的提问来源于stack exchange,提问作者14wml

