ios - FileManager 说文件不存在

标签 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 仍然在文档目录中未被触及(参见下面的应用程序容器图像以获取证据),FileManager 说PNG 不存在?

enter image description here

问题

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

最佳答案

从不存储完整的文件路径

我的 PDF 和图像位于 iOS 文件系统的 Documents 目录下。每次您运行应用程序时,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 answer有关如何生成文档目录路径的提示。

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

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

关于ios - FileManager 说文件不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138827/

相关文章:

ios - 带阴影的 UIView - 应用 renderInContext 时速度较慢

ios - 检测IOS中uiimageview中的透明像素

ios - PageControll 页面错误数 swift 4

iphone - 分配 - 添加为附件 View - 发布 : does it leak?

ios - 如何为 UITextFields 中的左 View 图像添加 X px 的填充?

objective-c - 在 Cocoa 中创建一个文件夹( bundle )

ios - 重命名文件(如果文件已存在)

objective-c - 当方法仍在运行时调用 Dealloc

Swift:无法将文件复制到新创建的文件夹

ios - 从 UIImageView 和 UITextView 创建 UIImage