【问题标题】:FileManager says file doesn't exist when it doesFileManager 说文件不存在
【发布时间】:2017-03-01 12:47:06
【问题描述】:

我有一个用例需要将 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 会忽略显而易见的事实并阻止我的应用程序运行?

【问题讨论】:

  • 打印路径并与预期的路径进行比较。
  • 我做到了。它们是相同的。
  • 我遇到了完全相同的问题!寻找答案!
  • @HanXu 我回答了我自己的问题。看看这对你有没有帮助。
  • @BrandonA,太好了!有用!谢了!

标签: ios nsfilemanager uigraphicscontext


【解决方案1】:

切勿存储完整的文件路径

我的 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

【讨论】:

  • let FManager = FileManager.default if let documentsPathURL = FManager.urls(for: .documentDirectory, in: .userDomainMask).first { print(documentsPathURL.absoluteString) do { let flist = try FManager.contentsOfDirectory (atPath: documentsPathURL.absoluteString) print(flist) } catch { print(error.localizedDescription) } } 没用
  • file:///Users/martian2049/Library/Developer/CoreSimulator/Devices/F1C4BEC1-02B8-4C54-81CD-A777E4A68B5A/data/Containers/Data/Application/AE887138-B40E-4325-9A3C -DBAFED35475B/Documents/ 文件夹“Documents”不存在。
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2018-10-29
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2011-03-15
相关资源
最近更新 更多