iOS文件管理

2022/1/7 iOS

# 沙盒简介

iOS 中每个应用程序都有一个独立的文件夹,这个文件夹就是沙盒。沙盒用来存储 app 的本地文件,例如:音频、视频、图片文件等。并且每个 app 的沙盒都是独立的,即当前 app 没有权限访问其他 app 的沙盒,所以说沙盒存储较之更安全。

沙盒分为 Bundles 和 Datas

  • Bundles 主要包括应用配置信息和二进制文件/资源
  • Datas 主要包括 Documents、Library、SystemData、tmp

Datas 结构

  • Documents 可以进行备份和恢复,体积较大,一般存储用户数据
  • Library 开发者最长使用的文件夹,可以自定义子文件夹
  • tmp 临时文件不会备份,启动时有可能被清除

# Library 和 Documents 的区别

Documents 是支持用户共享的,通过在 info.plist 中添加Application supports iTunes file sharing

Library 下有 Preferences、Caches 和一些自定义文件夹

  • Caches:存放体积大又不需要备份的数据,SDWebImage 缓存路径就是这个
  • Preference:用户偏好设置目录,UserDefault,iCloud 会备份设置信息

# 沙盒操作

# 获取沙盒路径

获取沙盒根路径

let homePath = NSHomeDirectory()
1

获取 document 路径

let pathArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
print(pathArray[0])
1
2

获取 library 路径

let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
1

获取 cache 路径

let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
1

获取 tmp 路径

let tmpPath = NSTemporaryDirectory()
1

获取程序包路径

let path = Bundle.main.resourcePath
1

获取图片资源路径

let imagePath = Bundle.main.path(forResource: "temp", ofType: "png")
1

# 文件管理

FileManager 类

  • 单例,提供 App 内⽂件 & ⽂件夹管理功能
  • 创建⽂件、删除文件、查询文件、移动和复制等
  • 读取⽂件内容 & 属性
  • 通过 URL 或者 String 作为 Path

FileManagerDelegate

  • 提供移动、复制、删除等操作的具体自定义实现

检查文件是否存在

FileManager.default.fileExists(atPath: filePath)
1

创建文件夹

FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
1

创建文件

let data = "Hello World".data(using: .utf8)
FileManager.default.createFile(atPath: path, contents: data, attributes: nil)
1
2

删除文件

FileManager.default.removeItem(atPath: path)
1

移动文件

FileManager.default.moveItem(atPath: oldPath, toPath: newPath)
1

复制文件

FileManager.default.copyItem(atPath: oldPath, toPath: newPath)
1

获取文件属性

FileManager.default.attributesOfItem(atPath: filePath)
1

# FileHandle

  • 读取⽂文件 & 写⽂文件
  • 读取指定的⻓长度 & 在指定位置追加/截断 截断 & ⽴立即刷新
  • 常⽤用于追加数据
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "test.txt"
if !FileManager.default.fileExists(atPath: path) {
    FileManager.default.createFile(atPath: path, contents: nil, attributes: nil)
}

let fileHandle = FileHandle(forWritingAtPath: path)!
fileHandle.seekToEndOfFile()
fileHandle.write("hello, world!".data(using: .utf8)!)
try? fileHandle.close()

if let content = try? String(contentsOfFile: path, encoding: .utf8) {
    print(content)
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# NSCoder

  • 归档(序列化)& 解归档(反序列化)
  • 提供简单的函数,在 Object 和二进制数据间进行转换
  • 抽象类 具体功能需要子类实现
class Movie: NSObject, NSCoding {
    var name: String
    var category: String

    init(name: String, category: String) {
        self.name = name
        self.category = category
    }

    required init?(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as! String
        category = aDecoder.decodeObject(forKey: "category") as! String
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(category, forKey: "category")
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Last Updated: 2022/9/11 17:39:53