1
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?