Skip to main content

ファイル (FileManager, Bundle)

ディレクトリ名(のURL)取得デフォルト

swift
let manager = FileManager.default
let docURLs = manager.urls(for: .documentDirectory, in: .userDomainMask)
let docURL = docURLs.first!

-> このようなディレクトリ名が取得される (通常 1 つ、のようだ)

  • Mac : file:///Users/XXXXXX/Library/Containers/com.XXXXXXX/Data/Documents/
  • iOS : file:///var/mobile/Containers/Data/Application/XXXXXXX/Documents/

ファイル名のフルパス取得

swift
let path = docURL.appendingPathComponent("test1.txt").path       // documentDirectory の場合
let path = Bundle.main.path(forResource: "test1", ofType: "txt") // Bundle の場合

-> Bundle の場合は このようなディレクトリ名で取得される

  • iOS : /private/var/containers/Bundle/Application/XXXXXXXX/XXXX.app/test1.txt

  • Bundle は、

    • プロジェクトのディレクトリ配下に置いたファイルを読むためのもの
      • ファイル作成時、target にチェックを入れる (ことでビルドしたアプリに同梱されるのだろう)
    • ちなみに 拡張子のとこ、.path(forResource: "test1.txt", ofType: "") でも問題ないようだ

ファイル作成

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

ファイル一覧取得

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: "tips.x", 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)

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)