iOS(Swift)调用Dropbox API创建已存在文件夹会产生什么行为
iOS Swift 调用 Dropbox API 创建已存在文件夹的响应规则与实践方案
接口实际响应表现
调用Dropbox官方Swift SDK的创建文件夹接口时,如果没有配置特殊冲突处理参数,当目标路径已经存在同名文件夹时,接口不会静默执行成功,会返回明确的错误:
- 错误归属于Files接口路由错误域,具体枚举值为
CreateFolderError.path(.conflict(.folder)) - 对应HTTP状态码为409,错误描述会明确标注目标路径存在同名文件夹
- 补充说明:如果目标路径下的同名资源是文件而非文件夹,返回的冲突错误枚举为
.file,和文件夹冲突的类型做了明确区分 - 如果创建时传入了
autorename: true参数,接口不会返回冲突错误,会自动给新创建的文件夹追加数字后缀(比如我的备份 (1))生成新路径,不会覆盖原有资源。
业务场景处理建议
针对「首次创建文件夹、后续重复触发创建逻辑」的固定路径文件夹场景,不要提前调用接口校验文件夹是否存在,直接发起创建请求即可,原因如下:
- 前置校验会额外增加一次网络请求,拉长操作链路,浪费流量和接口配额
- 前置校验存在无法规避的竞态问题:刚通过接口确认文件夹不存在,在发起创建请求的间隙,其他设备、其他线程可能已经提前创建了同名文件夹,依然会触发冲突错误,前置校验完全达不到规避错误的效果。
正确的处理逻辑非常简单:
- 关闭自动重命名参数(传
autorename: false),直接发起创建文件夹请求 - 创建成功时正常走后续业务流程
- 错误回调中单独判断错误类型,如果是「目标路径已存在同名文件夹」的冲突错误,直接忽略该错误,按创建成功的流程继续执行即可;如果是权限不足、路径非法、网络异常、鉴权失效等其他类型错误,再走对应的异常提示、重试逻辑即可。
这种处理方式没有任何异常副作用:Dropbox的创建文件夹接口本身不会对已存在的同名文件夹做任何修改,捕获对应冲突错误的处理方式,和提前做存在性校验的最终效果完全一致,但少一次网络请求,也不存在竞态漏洞。
下面是可直接参考的Swift实现代码:
import SwiftyDropbox func ensureTargetFolderExist(folderPath: String, completion: @escaping (Error?) -> Void) { DropboxClientsManager.authorizedClient?.files.createFolder( path: folderPath, autorename: false ).response { result, error in // 新建成功直接返回 guard result == nil else { completion(nil) return } // 解析错误 guard let callErr = error else { completion(nil) return } // 判断是否是已存在同名文件夹的冲突错误 if case .routeError(let errBox, _, _) = callErr, case .path(let pathErr) = errBox.unboxed, case .conflict(let conflictType) = pathErr.reason, case .folder = conflictType { // 文件夹已存在,视为操作成功 completion(nil) return } // 其余错误正常抛出 completion(callErr) } }
内容的提问来源于stack exchange,提问作者Doug Null
相关产品推荐
相关产品推荐

