Skip to main content

ファイル (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)

ファイル書き込み

swift
let data: Data? = "テスト文字列".data(using: .utf8)
manager.createFile(atPath: fileURL.path, contents: data)

Data ⇔ 文字列変換

String -> Data

swift
let data: Data? = text.data(using: .utf8)

Data -> String

swift
let text: String? = String(data: content, encoding: .utf8)

その他の操作

  • ディレクトリ作成
    • manager.createDirectory(atPath: path, ...)
  • ファイル削除
    • manager.removeItem(atPath: path)