返回

SwiftUI FileManager.default.copyItem \

IOS

如何解决 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. 如何避免这个问题?

确保下载任务已完成,并检查临时文件存在。