FileManager表示文件不存在

我有一个用例,需要将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说,一个文件不存在的时候。 第一次执行时, 我们创buildPDF 之前 ,FileManager可以检测到PDF确实存在。 但是, 我们从图像创buildPDF后 – 即使图像PNG仍然在文档目录中(请参阅应用程序容器的图像以进行certificate), FileManager说PNG不存在?

在这里输入图像说明

为什么FileManager忽略显而易见的事实并阻止我的应用程序运行?

切勿存储完整的文件path

我的PDF和图像位于iOS文件系统的Documents目录下。 每次运行应用程序时,iOS都会将root path更改为文档目录。 所以保存一个图像imagePath因为我以上将工作得很好, 直到我重新启动应用程序 。 这是因为我将整个path存储到我的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/是如何不同的。 这就是为什么当你检查一个文件是否在你的文档目录中时,实际上是在那里,但是根path已经改变了。


你该怎么办?

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

所以你需要做的是在运行时生成/Documents目录的path。 我不能强调这一部分。 这将保证您每次访问实际的文档目录。 看看这个SO回答了解如何生成文档目录path的提示。

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

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