我有一个用例需要将 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 不存在?
问题
为什么 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/