重新启动后尝试从Documents目录读取保存的数据时失败

时间:2018-09-20 10:38:45

标签: ios iphone swift

我已经阅读了一些类似问题的答案,并且每次问题都在保存绝对路径时,而不是每次都仅保存文件名并重新创建url时。我尝试遵循在这些答案中看到的代码示例,但结果是相同的:“因为没有这样的文件或目录,所以无法从文件读取”。我肯定在某个地方搞砸了,会有所帮助的 写作:

let dir = FileManager.default
         .urls(for: .documentDirectory, in: .userDomainMask)[0]
let accountDir = dir.appendingPathComponent("\(self.getHexString(str: self.account))", isDirectory: true)
let imageUrl = accountDir.appendingPathComponent("\(self.path.rawValue)")

if let imageData = UIImagePNGRepresentation(image) {
        FileManager().createFile(atPath: imageUrl.path, contents: imageData, attributes: nil)
    }

阅读:

let dir = FileManager.default
        .urls(for: .documentDirectory, in: .userDomainMask)[0]
    let accountDir = dir.appendingPathComponent("\(self.getHexString(str: self.account))", isDirectory: true)
    let imageUrl = accountDir.appendingPathComponent("\(self.path.rawValue)")

   let imageData = try Data(contentsOf: imageUrl)

2 个答案:

答案 0 :(得分:0)

有两个原因:

  1. 它没有正确创建路径。 尝试将image.path更改为image.absoluteString

  2. 我认为这只是在创建文件,而不是在其中写入任何内容

    在createfile之后尝试以下代码:

    let file = try FileHandle(forUpdating: imageUrl) file.seekToEndOfFile() file.write(data: imageData) file.closeFile()

答案 1 :(得分:0)

我认为我将图像存储到的目录是在将其附加到路径和标志isDirectory: true后自动创建的,但是没有。所以正确的代码是:

let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let accountDir = dir.appendingPathComponent("\(self.getHexString(str: self.account))", isDirectory: true)

    let isDirectoryExists = FileManager.default.fileExists(atPath: accountDir.path)
    if !isDirectoryExists {
        do {
            try FileManager.default.createDirectory(atPath: accountDir.path, withIntermediateDirectories: false, attributes: nil)
        } catch(let error) {
            print(error)
        }
    }

    let imageUrl = accountDir.appendingPathComponent("\(self.path.rawValue)")
    if let imageData = UIImagePNGRepresentation(image) {
        FileManager().createFile(atPath: imageUrl.path, contents: imageData, attributes: nil)
    }