跳到主要内容

文件系统与沙盒

问题

iOS 的沙盒结构是什么?各目录的用途?

答案

沙盒目录结构

App Sandbox/
├── Documents/ ← 用户数据,iCloud 备份
├── Library/
│ ├── Caches/ ← 缓存文件,系统可能清理
│ ├── Preferences/ ← UserDefaults plist
│ └── Application Support/ ← App 支持文件,iCloud 备份
├── tmp/ ← 临时文件,系统随时清理
└── SystemData/

获取路径

// Documents
let docs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

// Caches
let caches = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!

// tmp
let tmp = FileManager.default.temporaryDirectory

文件操作

let fm = FileManager.default
let filePath = docs.appendingPathComponent("data.json")

// 写入
let data = try JSONEncoder().encode(user)
try data.write(to: filePath)

// 读取
let readData = try Data(contentsOf: filePath)
let user = try JSONDecoder().decode(User.self, from: readData)

// 是否存在
fm.fileExists(atPath: filePath.path)

// 删除
try fm.removeItem(at: filePath)

常见面试问题

Q1: Documents 和 Caches 的区别?

答案

  • Documents:用户生成的数据,iCloud 自动备份,系统不会清理
  • Caches:可重新生成的缓存数据,不备份,磁盘空间不足时系统可能清理

Q2: 大文件应该存在哪里?

答案:下载的视频、图片缓存等放 Caches(可再次下载,不占备份空间)。用户创建的文档放 Documents。临时处理中间产物放 tmp

相关链接