iOS
Swift
Swift2.0

NSFileManagerでAPP保存領域のデータを操作する

More than 1 year has passed since last update.

はじめに

アプリを作成していく上で追加データとかを保存する領域がアプリごとに振り当てられているのでそこにデータを保存してみる。

ディレクトリ構成

MyApp.app/
 ┠ Document/
 │  ┗ Inbox/
 ┠ Library/
 │  ┠ Caches/
 │  ┗ Preferenses/
 ┗ tmp/

ディレクトリ別アクセス権

ディレクトリ 読み込み 書き込み iTunesによるバックアップ 備考
MyApp.app × O ×
Document O O O iTunes経由で閲覧可能
Inbox O O 書き込みはできないが削除は可能
Library O O Cacheはバックアップされない
Cache O O × システムによる自動削除あり
tmp O O × システムに自動削除されない

フォルダのチェック・作成

/Document以下にフォルダを作成。フォルダがすでにある場合は作成しないようにしてある。
※/Document以外にもいろいろなフォルダに書き込むことができるので以下を参照してみてください

Qiita:: 今こそ復習したい、iOSアプリのディレクトリ構成
http://qiita.com/tototti/items/8646405f47cc56a59722
Apple:: File System Programming Guide
File System Programming Guide: File System Basics

"/Documentを調べたい場合 "/folder_name" -> ""
"/Document/imagesの場合 "/folder_name" -> "/images"
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/folder_name"

"/Libraryを調べたい場合 "/folder_name" -> ""
"/Library/imagesの場合 "/folder_name" -> "/images"
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/folder_name"

// -- start check directory --
let fileManager = NSFileManager.defaultManager()
var isDir : ObjCBool = false

fileManager.fileExistsAtPath(path, isDirectory: &isDir)

if !isDir {
    try! fileManager.createDirectoryAtPath(path ,withIntermediateDirectories: true, attributes: nil)
}
// -- end check directory --

fileManager.fileExistsAtPath(path, isDirectory: &isDir)でフォルダの有無を確認しtruefalseの結果をisDirに格納します。

isDirfalseであれば/Documentもしくは/Libraryディレクトリにimagesフォルダを作成します。

ファイルの書き込み

// 保存するもの
let fileObject = "hogehoge"
// ファイル名
let fileName = "tes1.txt"            
// 保存処理
try! fileObject!.writeToFile("\(path)/\(fileName)", atomically: true, encoding: NSUTF8StringEncoding)

try! fileObject!.writeToFile("\(path)/\(fileName)", atomically: true, encoding: NSUTF8StringEncoding)を実行したと同時に選択したpathに"hogehoge"と入力された"tes1.txt"というテキストファイルが生成されます。

ファイルの移動・名前変更

// ファイル名を変更する "tes1.txt" --> "tes.txt"
// 旧ファイル名
let old_fileName = "tes1.txt"  
// 新ファイル名
let new_fileName = "tes.txt"  
try! NSFileManager.defaultManager().moveItemAtPath("\(path)/\(old_fileName)", toPath: "\(path)/\(new_fileName)")

これを実行することで/path/tes1.txt --> /path/tes.txtに変更されます。

ファイルの削除

try! NSFileManager.defaultManager().removeItemAtPath("\(path)/\(fileName)")

ファイルのコピー

let first_filename  = "tes1.txt"
let second_filename = "tes.txt"
try! NSFileManager.defaultManager().copyItemAtPath("\(path)/\(first_filename)", toPath: "\(path)/\(second_filename)");

ファイルの上書き

//削除して
try! NSFileManager.defaultManager().removeItemAtPath("\(path)/\(fileName)")
//作成
let fileObject = "hogehoge"
try! fileObject!.writeToFile("\(path)/\(fileName)", atomically: true, encoding: NSUTF8StringEncoding) 

注意

  • Documentsフォルダはユーザー作成のデータのみ。 ユーザ生成のデータではないファイルや、キャッシュデータなどは置かないように。 どうやら、Appleのガイドラインに違反するらしく申請してもリジェクトされます。
  • 再ダウンロード出来るデータ、再作成できるデータは/Library/Cachesに置く。
  • tempファイルなどは /tmp に置く。
  • バックアップが不要なファイルは [do not back up] 属性を付けて、無駄にバックアップ容量を取らせない。

おわり

CoreDataとかでデータを保存するよりも、うんと楽になりそうです。
便利なライブラリとかextensionも紹介していく予定なのでおたのしみに