Swift 5中创建并写入Documents文件夹子目录报错问题
错误排查与解决方案
根因分析
- macOS开发场景下未开启沙箱Documents目录读写权限,导致无法访问Documents目录下的子目录,触发路径不存在错误,这是出现
NSPOSIXErrorDomain Code=2报错的最高频原因 - 代码存在字符串转义错误:定义
tempTitle的行中写了"\n\Title: ",多余的反斜杠会生成非法转义字符,导致最终写入的字符串内容异常,连带路径解析出错 - 全局变量
fileName未正确初始化/为可选类型未解包,导致拼接出的最终文件路径无效 write方法的atomically参数设为false,在磁盘IO繁忙场景下可能出现目录未完成创建就触发写入的时序问题
修复方案
1. 配置权限(macOS适用)
打开Xcode项目设置 → 对应Target的Signing & Capabilities选项卡 → 找到App Sandbox → 把File Access下的Documents Folder权限设置为Read/Write,iOS开发无需额外配置该项。
2. 修正字符串转义错误
把错误的tempTitle定义行:
let tempTitle: String = "\n\Title: " + titleString + "\n\n"
修改为:
let tempTitle: String = "\nTitle: " + titleString + "\n\n"
删除Title前多余的反斜杠即可。
3. 优化路径与写入逻辑
将saveToDirectory方法改写为更稳定的版本,避免可选值、全局变量依赖与时序问题:
func saveToDirectory(fileName: String, content: String) { print(#function) let fileManager = FileManager.default guard let directoryURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { print("无法获取Documents目录路径") return } let myAppDirectoryURL = directoryURL.appendingPathComponent("MySubDirectory") do { // withIntermediateDirectories设为true时,目录已存在不会报错,无需额外判断 try fileManager.createDirectory(at: myAppDirectoryURL, withIntermediateDirectories: true) let documentURL = myAppDirectoryURL.appendingPathComponent(fileName) // atomically设为true,先写临时文件再替换,避免写入失败损坏旧文件 try content.write(to: documentURL, atomically: true, encoding: .utf8) print("写入成功,路径:\(documentURL.path)") } catch { print("操作失败:\(error.localizedDescription) 错误详情:\(error)") } }
把原来的saveToDirectory()调用替换为参数传递的形式,避免依赖全局变量:
saveToDirectory(fileName: fileName, content: myDocument)
内容的提问来源于stack exchange,提问作者ICL1901
相关产品推荐
相关产品推荐

