You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift使用FileManager写入文件到不存在目录时如何自动创建目录?

错误根因

你将路径拼接符替换为/后,生成的本地路径包含多级嵌套子目录,FileManager的moveItem方法默认不会自动创建目标路径中的中间父目录,因此抛出目录不存在错误。而之前使用-拼接时,所有路径段会被合并为单个文件名,不存在多级目录结构,因此可以正常运行。

解决方案

你可以在移动文件前主动判断目标父目录是否存在,不存在时自动创建所有层级的中间目录,有两种常用实现方式:

方式1:在保存方法中新增目录创建逻辑

func save(url: URL, fileUrl: URL) {
    do {
        let targetUrl = url.getLocalUrl()
        // 提取目标文件的父目录路径
        let parentDirectoryUrl = targetUrl.deletingLastPathComponent()
        // 自动创建所有不存在的中间目录,withIntermediateDirectories必须设为true
        try FileManager.default.createDirectory(at: parentDirectoryUrl, withIntermediateDirectories: true)
        try FileManager.default.moveItem(at: fileUrl, to: targetUrl)
    } catch {
        print("download.service.write.error: \(error)")
    }
}

这里不需要提前判断目录是否存在,createDirectory方法在withIntermediateDirectories为true时,若目录已存在会自动跳过,不会抛出错误。

方式2:将目录创建逻辑封装到URL扩展中

extension URL {
    func getLocalUrl() -> URL {
        let directoryURL = FileManager.default.getDocumentsDirectory()
        let filePath = pathComponents.dropFirst().joined(separator: "/")
        let targetUrl = directoryURL.appendingPathComponent(filePath)
        // 生成路径时自动创建父目录
        do {
            try FileManager.default.createDirectory(at: targetUrl.deletingLastPathComponent(), withIntermediateDirectories: true)
        } catch {
            print("create directory error: \(error)")
        }
        return targetUrl
    }
}

这种方式不需要修改原有保存逻辑,只要调用getLocalUrl()就会自动确保父目录存在。

内容的提问来源于stack exchange,提问作者Michael Jajou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:54:00