FileManager说文件不存在

Bra*_*n A 5 nsfilemanager ios 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)")
} 
Run Code Online (Sandbox Code Playgroud)

问题

FileManager说文件不存在.第一次执行此操作时,创建PDF 之前,FileManager可以检测到图像确实存在.但是,我们从图像创建PDF 之后 - 即使图像PNG仍然未触及文档目录(请参阅app容器下面的图片以进行证明),FileManager说PNG不存在?

在此输入图像描述

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

Bra*_*n A 14

永远不要存储完整的文件路径

我的PDF和图像Documents位于iOS文件系统中的目录下.root path每次运行应用程序时,iOS都会更改为文档目录.所以保存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答案,了解有关如何生成文档目录路径的提示.

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

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