返回
SwiftUI FileManager.default.copyItem \
IOS
2024-05-23 20:21:09
如何解决 SwiftUI 中 FileManager.default.copyItem 的 "文件不存在" 错误
问题
在使用 SwiftUI 项目时,你可能会遇到 FileManager.default.copyItem 函数抛出 "文件不存在" 错误。这是因为下载的文件不存在,导致临时文件无法复制。
解决方案
1. 检查下载状态
首先,确保下载任务已完成。你可以使用 downloadTask.state 属性来检查状态。
2. 检查文件权限
确保应用程序具有读取和写入文件系统的权限。在 Info.plist 文件中,添加键值对:
<key>NSFileProtectionComplete</key>
<false/>
3. 检查临时文件路径
获取正确的临时文件路径:
let temporaryURL = downloadTask.temporaryURL
4. 检查目标文件路径
确保 fileURL 路径正确,指向目标文件。
5. 使用 FileManager.default.copyItem(at:to:) 函数
复制临时文件时,使用 FileManager.default.copyItem(at:to:) 函数,而不是 FileManager.default.copyItem(atPath:toPath:) 函数。
更新代码
更新后的代码如下:
status = "downloading"
print("Downloading model \(modelName) from \(modelUrl)")
guard let url = URL(string: modelUrl) else { return }
let fileURL = getFileURLFormPathStr(dir:"models",filename: filename)
downloadTask = URLSession.shared.downloadTask(with: url) { temporaryURL, response, error in
if let error = error {
return
}
guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
print("Server error!")
return
}
do {
if let temporaryURL = downloadTask.temporaryURL {
try FileManager.default.copyItem(at: temporaryURL, to: fileURL)
}
} catch {
print("Error copying file: \(error)")
}
}
结论
通过遵循这些步骤,你可以解决 FileManager.default.copyItem 函数抛出的 "文件不存在" 错误,并成功下载模型。
常见问题解答
1. 为什么会出现 "文件不存在" 错误?
因为下载的文件不存在或临时文件在复制之前已被删除。
2. 如何检查下载状态?
使用 downloadTask.state 属性。
3. 如何获取正确的临时文件路径?
使用 downloadTask.temporaryURL 属性。
4. 如何更新代码?
请参考上面提供的更新代码。
5. 如何避免这个问题?
确保下载任务已完成,并检查临时文件存在。