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
相关产品推荐
相关产品推荐

