iOS文件都有哪些?
iOS 文件管理有四个目录 Documents、Library/Caches、tmp
Documents目录: FileManager.documentDirectory 用户主动保存的持久化数据
Library/Caches目录:FileManager.cachesDirectory 可重新下载的缓存数据
tmp目录: NSTemporaryDirectory() 短期使用的临时视频
如何选择
- 用户主动下载且需要长期保留的视频
适用场景:用户明确选择离线保存、不可重新下载的视频(如付费内容、用户创作素材)
存储路径: Documents目录
注意事项:需为文件添加NSURLIsExcludedFromBackupKey属性,避免被iCloud自动备份
方法如下:
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("video.mp4")
try data.write(to: fileURL)
try fileURL.setResourceValue(true, forKey: .isExcludedFromBackupKey)
2.可重新下载或临时缓存的数据
适用场景 应用自动缓存、可重复下载的视频(如流媒体播放缓存、临时预览文件等)
存储路径:Library/Caches 目录
优势系统可自动清理该目录,避免占用过多存储空间12。
- 路径获取方法 let cachesURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
创建目录
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let mapDir = documentsURL.appendingPathComponent("目录1/目录2")
createDirectoryIfNeeded(at: mapDir)
安全创建目录
/// - 参数 directoryURL: 目标目录的完整URL
func createDirectoryIfNeeded(at directoryURL: URL) throws {
let fileManager = FileManager.default
var isDirectory: ObjCBool = false
// 先检测路径是否存在且为目录
if fileManager.fileExists(atPath: directoryURL.path, isDirectory: &isDirectory) {
guard isDirectory.boolValue else {
throw NSError(domain: "路径已被文件占用", code: 409, userInfo: nil)
}
return // 目录已存在,无需创建
}
// 不存在则创建多级目录
try fileManager.createDirectory(
at: directoryURL,
withIntermediateDirectories: true,
attributes: nil
)
}
安全写入文件(自动处理覆盖逻辑)
/// - 参数 fileURL: 目标文件的完整URL
/// - 参数 data: 要写入的二进制数据
func safeWriteFile(at fileURL: URL, data: Data) throws {
let fileManager = FileManager.default
// 检测文件是否已存在
if fileManager.fileExists(atPath: fileURL.path) {
try fileManager.removeItem(at: fileURL) // 删除旧文件以覆盖
}
// 确保父目录存在
try createDirectoryIfNeeded(at: fileURL.deletingLastPathComponent())
// 写入新数据:ml-citation{ref="5,8" data="citationList"}
try data.write(to: fileURL)
// 标记防备份(仅限 Documents 目录)
if fileURL.path.contains("Documents") {
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
try fileURL.setResourceValues(resourceValues)
}
}
/// 检查文件是否存在
func checkPathExists(_ url: URL) -> (isDirectory: Bool, exists: Bool) {
var isDirectory: ObjCBool = false
let exists = FileManager.default.fileExists(atPath: url.path,isDirectory: &isDirectory)
return (isDirectory.boolValue, exists)
}
以上就是在使用iOS文件管理的一点用法,与诸位共勉