ファイル (FileManager, Bundle)
用語の区別
- Documents
- アプリごとのサンドボックス内フォルダ
- ユーザ側からは Files で読み書き可
- Mac の Finder の「ファイル共有」に出すには UIFileSharingEnabled=YES 設定が必要
- Bundle Resource
- アプリ本体(.app)に同梱されたリソース
- Xcode のプロジェクト内にドラッグで取り込んだファイル
事前の設定など
Q. Document ディレクトリを Finder (iTunes) から見れるようにするには、
A. Info.plist で、Application supports iTunes file sharing (UIFileSharingEnabled) を YES に設定する
Documents: URL
swift
let manager = FileManager.default
let docURLs = manager.urls(for: .documentDirectory, in: .userDomainMask)
let docURL = docURLs.first!
swift
let fileURL = docURL.appendingPathComponent("test1.txt")
→ このようなディレクトリ名が取得される (通常 1 つ、のようだ)
- Mac :
file:///Users/XXXXXX/Library/Containers/com.XXXXXXX/Data/Documents/ - iOS :
file:///var/mobile/Containers/Data/Application/XXXXXXX/Documents/
Documents, Bundle: Path
swift
let path = docURL.appendingPathComponent("test1.txt").path // documentDirectory の場合
let path = Bundle.main.path(forResource: "test1", ofType: "txt") // Bundle の場合
let path = Bundle.main.path(forResource: "test1.txt", ofType: nil) // Bundle の場合(こうでも良いようだ?)
→ Bundle の場合は このようなディレクトリ名で取得される
- iOS :
/private/var/containers/Bundle/Application/XXXXXXXX/XXXX.app/test1.txt
ファイル一覧取得
swift
if let fnames = try? manager.contentsOfDirectory(atPath: docURL.path) {
for fname in fnames {
print(fname)
}
}
ファイル読み込み
swift
if let content = manager.contents(atPath: filePath) {
if let text = String(data: content, encoding: .utf8) {
print(text)
}
}
swift
let manager = FileManager.default
guard let path = Bundle.main.path(forResource: "test", ofType: "json"),
let content = manager.contents(atPath: path),
let text = String(data: content, encoding: .utf8)
// let json = try? JSON(data: content) // <- SwiftyJSON から読むならこう
else {
return
}
print(text)