Swift实现文件不存在则创建、存在则追加写入字符串的方法
嘿,我来帮你搞定这个Swift文件写入的问题~你原来的思路方向是对的,但代码里有几个容易踩的小坑,比如误用了absoluteString来获取文件路径,其实还有更简洁的写法,不用手动判断文件是否存在,直接就能实现「不存在创建、存在追加」的需求,我给你整理两种靠谱的实现方式:
实现「创建/追加写入」的两种方法
方法一:用FileHandle(灵活控制读写流程)
这种方式适合需要精细控制文件操作的场景,比如要定位写入位置:
let text = "你要写入的目标字符串" let fileManager = FileManager.default // 获取系统文档目录URL guard let documentsDirURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last else { print("无法获取系统文档目录") return } let targetFileURL = documentsDirURL.appendingPathComponent("out.txt") // 将字符串转为UTF-8格式的Data guard let dataToWrite = text.data(using: .utf8) else { print("字符串转Data失败,请检查字符编码") return } do { if fileManager.fileExists(atPath: targetFileURL.path) { // 文件已存在,打开文件句柄并追加到末尾 let fileHandle = try FileHandle(forWritingTo: targetFileURL) fileHandle.seekToEndOfFile() // 移动到文件末尾位置 fileHandle.write(dataToWrite) fileHandle.closeFile() } else { // 文件不存在,直接写入创建 try dataToWrite.write(to: targetFileURL) } print("写入/追加操作成功!") } catch { print("操作失败:\(error.localizedDescription)") }
方法二:用String的write方法(极简写法)
这种方式一行核心代码就能搞定,系统会自动处理「创建/追加」逻辑:
let text = "你要写入的目标字符串" let fileManager = FileManager.default // 获取系统文档目录URL guard let documentsDirURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last else { print("无法获取系统文档目录") return } let targetFileURL = documentsDirURL.appendingPathComponent("out.txt") do { // 关键:设置options为[.append, .atomicWrite],自动处理创建/追加 try text.write(to: targetFileURL, options: [.append, .atomicWrite], encoding: .utf8) print("写入/追加操作成功!") } catch { print("操作失败:\(error.localizedDescription)") }
重要注意事项
- 别再用
absoluteString获取文件路径了!它返回的是带file://前缀的URL字符串,而fileExists(atPath:)需要的是本地文件的纯路径,应该用targetFileURL.path。 - 方法二中的
.atomicWrite选项是可选的,但加上它会更安全:系统会先把内容写入临时文件,成功后再替换目标文件,避免写入失败导致原文件损坏。
内容的提问来源于stack exchange,提问作者Ginso89
相关产品推荐
相关产品推荐

