LoginSignup
4
2

More than 1 year has passed since last update.

FileManager事件簿〜ファイルを保存したパスにファイルがない

Last updated at Posted at 2022-04-03

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関連の情報を発信しています。

Twitter
Medium
GitHub

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2