iOS写入图片数据到缓存目录失败:文件始终不存在
问题分析与解决方案
嘿,我来帮你拆解下这个问题——你遇到的核心矛盾是「代码没抛错但文件找不到」,其实主要是两个小细节没处理对,咱们一步步来:
1. fileExists(atPath:) 参数传错了(直接导致返回false)
你现在传给fileExists(atPath:)的是cachedImageURL.absoluteString,这是带file://前缀的完整URL字符串,但这个方法需要的是不带协议前缀的纯本地文件路径。
举个直观的例子:
- 错误输入:
"file:///var/mobile/Containers/..." - 正确输入:
"/var/mobile/Containers/..."
解决办法很简单,把absoluteString换成path或者relativePath:
print(fileManager.fileExists(atPath: cachedImageURL.path))
2. 图片数据解包的语法有问题
你的代码里let imageData = UIImageJPEGRepresentation(image, 1.0) else这行语法是错的,编译都通不过,应该用guard let来安全解包:
guard let imageData = UIImageJPEGRepresentation(image, 1.0) else { fatalError("Impossible to read the image") }
3. 额外的稳妥排查点
如果换了参数后还是找不到文件,可以再检查这两点:
- 确保缓存目录存在:虽然
write(to:)理论上会自动创建父目录,但保险起见可以提前创建,避免意外:try! fileManager.createDirectory(at: cachedImageURL.deletingLastPathComponent(), withIntermediateDirectories: true) - 别用
try!硬闯:换成do-catch捕获错误,能帮你确认文件到底有没有真的写入(有时候try!会掩盖隐性错误):do { guard let imageData = UIImageJPEGRepresentation(image, 1.0) else { fatalError("Impossible to read the image") } try fileManager.createDirectory(at: cachedImageURL.deletingLastPathComponent(), withIntermediateDirectories: true) try imageData.write(to: cachedImageURL, options: .atomic) print(fileManager.fileExists(atPath: cachedImageURL.path)) // 现在应该返回true了 } catch { print("写入失败:\(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者Alexis Darnat
相关产品推荐
相关产品推荐

