Swift 文件系统操作入门
iOS 和 macOS 开发经常需要与设备的文件系统进行交互。无论是保存用户数据、缓存图片还是导出文档,掌握文件和文件夹操作是每位 Swift 开发者的必备技能。本文将详细讲解如何使用 FileManager、URL 和 Data 执行所有基本的文件系统操作。
我们将介绍文件的创建、读取、写入和删除,以及目录导航。所有代码示例均使用 Swift 5 编写,适用于 iOS 和 macOS 项目。
核心组件:FileManager 和 URL
在 Swift 中,用于文件系统操作的核心类是 FileManager。它提供了管理文件、目录及其属性的方法。路径使用 URL 结构体指定,这是比字符串更安全、更现代的替代方案。
获取标准目录
首先需要知道如何获取标准系统目录的路径。对于 iOS,通常是 Documents、Library/Caches 和 tmp。
import Foundation
let fileManager = FileManager.default
// Documents 目录guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("无法获取 Documents 目录")}print("Documents: \\(documentsURL.path)")
// Caches 目录guard let cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first else { fatalError("无法获取 Caches 目录")}print("Caches: \\(cachesURL.path)")
// 临时目录let tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")创建和写入文件
在 Swift 中创建文件包括创建路径和写入数据两个步骤。我们来看两种主要方法。
写入文本数据
func createTextFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("example.txt") let content = "你好,世界!这是一个测试文件。" do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("文件已成功创建于路径:\\(fileURL.path)") } catch { print("文件写入错误:\\(error.localizedDescription)") }}写入二进制数据(图片、归档)
func createBinaryFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("data.bin") let data = Data([0x48, 0x65, 0x6C, 0x6C, 0x6F]) // "Hello" 的十六进制表示 do { try data.write(to: fileURL, options: .atomic) print("二进制文件已创建") } catch { print("错误:\\(error)") }}创建目录
func createDirectory() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let newDirURL = documentsURL.appendingPathComponent("MyFolder") do { try fileManager.createDirectory(at: newDirURL, withIntermediateDirectories: true, attributes: nil) print("目录已创建:\\(newDirURL.path)") } catch { print("目录创建错误:\\(error)") }}读取和检查文件
文件创建后,需要能够读取它们并检查其是否存在。
检查文件是否存在
func fileExists(at url: URL) -> Bool { return fileMan