FileManager 说文件不存在
FileManager says file doesn't exist when it does
我有一个用例需要将 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
表示文件不存在。 第一次执行时,before 我们创建 PDF,FileManager 可以检测到图像 PDF 确实存在。但是 之后,我们从图像创建 PDF - 即使图像 PNG 仍然在文档目录中未被触及(请参见下面的应用程序容器图像以获取证据),FileManager
表示PNG 不存在?
问题
为什么 FileManager
忽略显而易见的事实并阻止我的应用程序运行?
从不存储完整的文件路径
我的 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/
有何不同。这就是为什么当你检查一个文件是否在你的文档目录中并且实际上在那里,但是根 path 已经改变了。
你该怎么办?
不存储整个文件路径,只存储来自 文档目录的子路径。所以我所做的是在名为 Media
的文档目录中创建了一个子文件夹,我将文件保存到该文件夹中,而我存储到对象 imagePath
的路径将是 Media/theFileName.PNG
.
所以你需要做的是在运行时间生成/Documents
目录的路径。我怎么强调这部分都不为过。这将保证您每次 都访问实际的文档目录。查看此 SO answer 以获取有关如何生成文档目录路径的提示。
获得 运行 时间文档目录的路径后,只需将存储的路径添加到该目录的末尾,它应该如下所示:
file:///var/mobile/Containers/Data/Application/URID09RE-5711-TI70-1252-OP4G5JH3WDST/Documents/Media/theFileName.PNG
我有一个用例需要将 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
表示文件不存在。 第一次执行时,before 我们创建 PDF,FileManager 可以检测到图像 PDF 确实存在。但是 之后,我们从图像创建 PDF - 即使图像 PNG 仍然在文档目录中未被触及(请参见下面的应用程序容器图像以获取证据),FileManager
表示PNG 不存在?
问题
为什么 FileManager
忽略显而易见的事实并阻止我的应用程序运行?
从不存储完整的文件路径
我的 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/
有何不同。这就是为什么当你检查一个文件是否在你的文档目录中并且实际上在那里,但是根 path 已经改变了。
你该怎么办?
不存储整个文件路径,只存储来自 文档目录的子路径。所以我所做的是在名为 Media
的文档目录中创建了一个子文件夹,我将文件保存到该文件夹中,而我存储到对象 imagePath
的路径将是 Media/theFileName.PNG
.
所以你需要做的是在运行时间生成/Documents
目录的路径。我怎么强调这部分都不为过。这将保证您每次 都访问实际的文档目录。查看此 SO answer 以获取有关如何生成文档目录路径的提示。
获得 运行 时间文档目录的路径后,只需将存储的路径添加到该目录的末尾,它应该如下所示: