FileManagerでファイルを保存したパスのファイルが消える事件発生
例えば画像をアプリのDocumentDirectoryに保存して、あとでロードしたいとするじゃないですか。
とりあえずpngをFileManagerで作ったurlに保存して、pathのstringをUserDefaultsで保存しとく。
let imageData:Data = uiImage.pngData()
let url:URL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent(UUID().uuidString+".png")
try! imageData?.write(to: url)
let path:String = url.path
UserDefaults.standard.set(, forKey: "imagePath")
で、アプリを一度終了したあと、同じパスから画像を読み出そうとする。
let savedPath = UserDefaults.standard.string(forKey: "path")!
let url = URL(fileURLWithPath: savedPath)
let data = try! Data(contentsOf: url)
let uiImage = UIImage(data: data)
すると、ファイルがない!
解決
原因は、アプリを終了すると、アプリのドキュメントディレクトリのパスが変わることがあるため。
というのは、アプリを閉じる前だと、上記のコードは機能します。
対策として、ファイル名だけUserDefaultsで保存しておいて、再度ファイルマネージャーでドキュメントディレクトリを探してファイル名を付け足すと、保存したファイルが見つかります。
Save:
let imageData = image?.pngData()
let uniqueFileName = UUID().uuidString+".png"
let url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent(uniqueFileName)
try! imageData?.write(to: url)
UserDefaults.standard.set(uniqueFileName, forKey: "path") // ファイル名だけ保存しておく
Load:
let fileName = UserDefaults.standard.string(forKey: "path")!
let url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent(fileName) // 再度ドキュメントディレクトリを検索して、ファイル名を付け足す。
let data = try! Data(contentsOf: url)
let uiImage = UIImage(data: data)
これで無事に読み出せます。
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。