Проблема с загрузкой файла с диска

#swift #swift3 #nsfilemanager #nsdocumentdirectory

#swift #swift3 #nsfilemanager #nsdocumentdirectory

Вопрос:

Хорошо, это заставило меня некоторое время ломать голову.

У меня есть файл png, который я записываю на диск. Я получаю данные с помощью:

 let data = UIImagePNGRepresentation(scaledImage!)
let filename = getDocumentsDirectory().appendingPathComponent("(record.uid!).png")
  

Я пытаюсь перехватить, и, кажется, все работает. Результирующее имя файла:

 file:///var/mobile/Containers/Data/Application/C6B796E8-2DB6-45A4-9B18-EF808B8CA3CA/Documents/580420d51800cd826a7e217c.png
  

Проблема возникает, когда я пытаюсь загрузить это изображение обратно с диска.

Когда я получаю список всех файлов в каталоге documents, я получаю:

 [file:///private/var/mobile/Containers/Data/Application/C6B796E8-2DB6-45A4-9B18-EF808B8CA3CA/Documents/580420d51800cd826a7e217c.png]
  

Единственное различие, которое я вижу, это «частная» часть пути к файлу. Когда я пытаюсь проверить, существует ли файл, используя путь к файлу, я получаю ответ от добавления имени файла (того, которое без частной части) Я получаю false.

Чего я не понимаю?

Комментарии:

1. Помогло ли это вам, в моем случае все работало нормально

Ответ №1:

Код Swift 3/4

Предположим, что метод getDocumentsDirectory() определен следующим образом

 func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        return documentsDirectory
}
  

Для того, чтобы сохранить изображение

 let data = UIImagePNGRepresentation(scaledImage!)
let filename = getDocumentsDirectory().appendingPathComponent("(record.uid!).png")
try? data?.write(to: filename)
  

И ваше изображение сохраняется в каталоге Documents

Теперь, чтобы загрузить его обратно

 let imagePath = getDocumentsDirectory().appendingPathComponent("(record.uid!).png").path

let fileManager = FileManager.default
if fileManager.fileExists(atPath: imagePath){
    print("Image Present")
    //load it in some imageView
}else {
    print("No Image")
}
  

Комментарии:

1. Вы упускаете суть. Распечатайте URL-адреса в своем коде, и вы увидите проблему: в ImagePath нет ведущего «private».

2. OP не опубликовал тело своей getDocumentsDirectory() функции, поэтому я предположил то же самое. Мои URL-адреса: Протестированы на устройстве — Печать описания имени файла: "///var/mobile/Containers/Data/Application/46B10A6C-43EE-4D11-83E5-88B6ADF1E646/Documents/testImage.png" Печать описания пути к изображению: "/var/mobile/Containers/Data/Application/46B10A6C-43EE-4D11-83E5-88B6ADF1E646/Documents/testImage.png" Итак, я полагаю, что в теле getDocumentsDirectory() функции есть какая-то проблема, которая делает URL-адрес, ведущий на private, при возврате изображения обратно. Это было предположение.