为什么Swift不仅仅是UI,还涉及文件操作
当开发者开始学习Swift时,他们最常编写的是带有界面、动画和网络请求的应用程序。但迟早会遇到这样的任务:在设备上保存数据、读取配置文件、解析JSON文件或只是复制文档。这时很多人会感到困惑。其实大可不必——Swift中的文件操作如此优雅且设计周到,以至于用过之后就不想再回到其他语言了。
在本文中,我们将从简单到复杂,逐步讲解Swift中的文件系统交互。您将学习如何创建、读取、写入和删除文件,操作目录,处理错误,甚至加密数据。让我们开始吧!
基础:FileManager和FileHandle
Swift文件系统的核心是FileManager类。这是一个“调度器”,它了解设备上关于文件夹和文件的一切。它可以检查文件是否存在、移动、复制和删除对象。要处理文件内容(读取和写入),可以使用FileHandle或更高级的方法,如Data、String和Codable。
文件存储在哪里?路径和目录
在编写代码之前,需要了解我们有权将数据保存在哪里。在iOS和macOS中有严格的规则:应用程序只能写入自己的沙盒(sandbox)。最常用的目录有:
- Documents — 用于应在备份时保留的用户数据。
- Library/Caches — 用于系统可能删除的临时文件。
- tmp — 用于一次性文件,重启时会被删除。
获取所需文件夹的路径非常简单:
import Foundation
let fileManager = FileManager.defaultlet documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!print("Documents: \\(documentsURL.path)")
let cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!print("Caches: \\(cachesURL.path)")在Swift中创建和删除文件
我们从最基本的开始——在Documents目录中创建一个空文件:
let fileURL = documentsURL.appendingPathComponent("myFile.txt")
// 如果文件不存在则创建if !fileManager.fileExists(atPath: fileURL.path) { fileManager.createFile(atPath: fileURL.path, contents: nil, attributes: nil) print("文件已创建!")}请注意:createFile(atPath:contents:attributes:)返回一个Bool值,指示文件是否成功创建。始终检查结果——这可以避免意外错误。
删除文件只需一行代码:
do { try fileManager.removeItem(at: fileURL) print("文件已删除")} catch { print("删除错误:\\(error.localizedDescription)")}这里我们使用try和do-catch块——这是Swift中处理错误的标准方法。切勿在不检查的情况下调用removeItem,否则应用程序会崩溃。
读取和写入文本文件
最常见的场景是处理文本数据。Swift提供了便捷的方法来读取Swift文件和通过字符串写入:
// 写入文本let text = "你好,世界!Hello, Swift!"do { try text.write(to: fileURL, atomically: true, encoding: .utf8) print("文本已写入")} catch { print("写入错误:\\(error)")}
// 读取文本do { let savedText = try String(contentsOf: fileURL, encoding: .utf8) print("读取内容:\\(savedText)")} catch { print("读取错误:\\(error)")}atomically: true标志确保写入是原子性的——数据首先写入