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

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

##ディレクトリ構成
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](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html)

```swift
"/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`フォルダを作成します。

##ファイルの書き込み
```swift
// 保存するもの
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"というテキストファイルが生成されます。

##ファイルの移動・名前変更
```swift
// ファイル名を変更する　"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`に変更されます。

##ファイルの削除
```swift
try! NSFileManager.defaultManager().removeItemAtPath("\(path)/\(fileName)")
```

##ファイルのコピー
```swift
let first_filename  = "tes1.txt"
let second_filename = "tes.txt"
try! NSFileManager.defaultManager().copyItemAtPath("\(path)/\(first_filename)", toPath: "\(path)/\(second_filename)");
```

##ファイルの上書き
```swift
//削除して
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も紹介していく予定なのでおたのしみに