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

Swift中如何检测目录是否创建成功或已存在?

问题解决:Swift中检测目录是新建还是已存在

错误原因

你遇到的报错是因为调用了抛出错误版本的createDirectory(atPath:withIntermediateDirectories:attributes:),这个方法的返回类型是Void(无返回值),不能赋值给布尔类型变量dirOK,所以编译器报错类型不匹配。

正确实现方案

要区分目录是「刚创建成功」还是「原本就存在」,可以通过两种方式实现:

方案1:使用非抛出错误的API

这个版本的createDirectory会返回布尔值表示操作是否成功,同时可以通过指针获取错误信息:

var error: NSError?
let operationSuccess = FileManager.default.createDirectory(
    atPath: toDirectory,
    withIntermediateDirectories: true,
    attributes: nil
)

if operationSuccess {
    // 操作成功,区分目录是已存在还是新建
    var isDirectory: ObjCBool = false
    if FileManager.default.fileExists(atPath: toDirectory, isDirectory: &isDirectory), isDirectory.boolValue {
        print("目录原本就存在")
    } else {
        print("目录创建成功")
    }
} else {
    print("目录操作失败:\(error?.localizedDescription ?? "未知错误")")
}

方案2:先检查目录存在性,再用抛出错误的API

先判断目录是否存在,不存在时再执行创建操作,通过是否抛错判断结果:

var isDirectory: ObjCBool = false
let directoryExists = FileManager.default.fileExists(atPath: toDirectory, isDirectory: &isDirectory) && isDirectory.boolValue

do {
    if !directoryExists {
        try FileManager.default.createDirectory(atPath: toDirectory, withIntermediateDirectories: true)
        print("目录创建成功")
    } else {
        print("目录原本就存在")
    }
} catch {
    print("目录创建失败:\(error.localizedDescription)")
}

补充说明

FileManager的createDirectory有两个核心版本:

  • 带throws的版本:操作失败时抛出错误,无返回值
  • 不带throws的版本:操作失败时返回false,需通过NSError指针获取错误详情

你之前的代码误用了带throws的版本,导致无法接收布尔返回值,这就是报错的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:22:56