##はじめに
アプリを作成していく上で追加データとかを保存する領域がアプリごとに振り当てられているのでそこにデータを保存してみる。
##ディレクトリ構成
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)
でフォルダの有無を確認しtrue
かfalse
の結果をisDir
に格納します。
isDir
がfalse
であれば/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も紹介していく予定なのでおたのしみに