FileManager说文件不存在

时间:2016-10-19 18:19:17

标签: ios nsfilemanager uigraphicscontext

我有一个用例需要将UIImage保存到文档目录 - 然后UIImage需要转换为PDF并保存到文档目录。

转换为PDF格式的代码

var filePath = NSString(string: self.selectedMedia!.imagePath!)

if FileManager().fileExists(atPath: filePath as String) {

       filePath = filePath.deletingPathExtension as NSString
       filePath = NSString(string: filePath.appendingPathExtension("PDF")!)

       if let image = UIImage(data: self.selectedMedia?.image! as! Data) {

           let rect:CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

           UIGraphicsBeginPDFContextToFile(filePath as String, rect, nil);
           UIGraphicsBeginPDFPageWithInfo(rect, nil);
           UIGraphicsGetCurrentContext();
           image.draw(in: rect)
           UIGraphicsEndPDFContext();

           self.selectedMedia?.imagePath = filePath as String

           CoreData.save()
       }

       self.showPDFEditor()
   }
else {
   print("Missing File At Path \(filePath)")
} 

问题

FileManager表示文件不存在。第一次执行此文件时, 之前我们创建PDF,FileManager可以检测到图像PDF确实存在。但是之后我们会从图片中创建PDF - 即使图片PNG仍在未触及的文档目录中(请参阅app容器下面的图片以进行校对),FileManager表示PNG没有存在?

enter image description here

问题

为什么FileManager忽略了明显的事实并使我的应用程序无法运行?

1 个答案:

答案 0 :(得分:13)

从不存储完整的文件路径

我的PDF和图片位于iOS文件系统中的Documents目录下。每次运行应用程序时,iOS都会将root path更改为文档目录。因此,如上所述保存imagePath可以正常工作,直到我重新启动应用。那是因为我将整个路径存储到我的selectedMedia对象。

现在 - file:///var/mobile/Containers/Data/Application/7A31EDFD-8644-45A5-8381-FE189E27D6E5/Documents/

可能会在稍后 - file:///var/mobile/Containers/Data/Application/URID09RE-5711-TI70-1252-OP4G5JH3WDST/Documents/

了解Application/someLongNumber/的不同之处。这就是为什么当你检查一个文件是否在你的文件目录中并且实际上在那里时,但根路径已经改变了。

你应该怎么做?

而不是存储整个文件路径只是存储来自文档目录的子路径。所以我所做的是在文件目录中创建了一个名为Media的子文件夹,我将文件保存到,并且我存储到我的imagePath对象的路径将是Media/theFileName.PNG

因此,您需要做的是在运行时生成/Documents目录的路径。我不能强调这一部分。这样可以保证您每次都访问的实际文档目录。查看此SO answer以获取有关如何生成文档目录路径的提示。

获得运行时文档目录的路径后,只需将存储的路径添加到该文件的末尾,它应如下所示:

file:///var/mobile/Containers/Data/Application/URID09RE-5711-TI70-1252-OP4G5JH3WDST/Documents/Media/theFileName.PNG