无法将文件保存到iOS Swift本地存储

3
我试图从服务器下载文件内容,创建一个客户端文件并将所有内容传输到该文件中。我正在将文件保存到本地存储器中,但是它无法保存并抛出异常,提示您没有权限保存在文件夹中。已尝试许多方法但无法解决。我对iOS编程很陌生,请帮帮我,谢谢。
以下是我的代码:
 let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
 var fileURL : URL = URL(fileURLWithPath: documentsUrl!.path+filename)
  fileURL = URL(fileURLWithPath: documentsUrl!.path+filename+".doc")
  let data = NSData(contentsOf: tempLocalUrl)
                do {
                    try data?.write(to: fileURL, options: .atomic)
                } catch {
                    print(error,"helooooooooooooooooo")
                }

我已经尝试使用相对路径和绝对字符串,但仍然没有成功。
这是错误信息:
Error Domain=NSCocoaErrorDomain Code=513 "你没有权限在文件夹“0103E60B-478F-475B-A8F2-788534F5D206”中保存文件“DocumentsImport From IE.doc”" UserInfo={NSFilePath=/var/mobile/Containers/Data/Application/0103E60B-478F-475B-A8F2-788534F5D206/DocumentsImport From IE.doc, NSUnderlyingError=0x1076efe90 {Error Domain=NSPOSIXErrorDomain Code=1 "操作不允许"}}。

1
documentsUrl 是从哪里来的?你是如何提取那个URL的? - holex
我已经编辑了代码,请检查 @holex - Ashish yadav
1
我相信你已经注意到了路径和文件名之间缺少了 /,例如 .../Documents + / + Import From IE.doc,你目前没有这个 / - 最好使用 addPathComponent(...) 而不是连接原始字符串值... 这可能有助于避免将来出现这样的故障。 - holex
永远不要使用字符串连接来构建路径。使用URL的适当API即可解决此问题。 - vadian
谢谢 @holex,它起作用了,你节省了我的时间。 - Ashish yadav
感谢 @vadian,我明白你的意思了。 - Ashish yadav
3个回答

9

不要创建像这样的路径

documentsUrl!.path+filename+".doc"

不要这样做。你可能会忘记实际上已经包含的路径分隔符。

URL 提供了专门的 API 来构建路径。

let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsUrl.appendingPathComponent(filename).appendingPathExtension("doc")
do {
    let data = try Data(contentsOf: tempLocalUrl) // not NSData !!
    try data.write(to: fileURL, options: .atomic)
} catch {
    print(error,"helooooooooooooooooo")
}

2

您在错误中的路径为:

/var/mobile/Containers/Data/Application/0103E60B-478F-475B-A8F2-788534F5D206/DocumentsImport From IE.doc

替代:

/var/mobile/Containers/Data/Application/0103E60B-478F-475B-A8F2-788534F5D206/Documents/Import From IE.doc

使用appendingPathComponent函数将路径元素拼接在一起。


2
我这样保存我的图片
 let fileManager = FileManager.default
 do {

     let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
     let fileURL = documentDirectory.appendingPathComponent(name)
     let image = #imageLiteral(resourceName: "Notifications")if let imageData = UIImageJPEGRepresentation(image, 0.5) {
         try imageData.write(to: fileURL)
         return true  
     }
 } catch {   
    print(error) 
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接