おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

【Swift 5】文字列をテキストファイルに保存、読み出し、新規作成、存在確認のサンプル

f:id:hitoridehitode:20190616162725j:plain

この記事では、Swift5(iOS)にて基本的なファイル操作のサンプルを紹介します。 また、この記事で作成したサンプルアプリのソースコードは Githubで閲覧できます。

ファイル操作

ファイルが存在するかどうか確認する

FileManagerfileExists()を利用します。FileManagerはクラスです。
FileManagerクラスはファイルシステムへのインターフェースとして、便利なメソッドを提供しています。

let dir = FileManager.default.urls(
  for: .documentDirectory, 
  in: .userDomainMask
).first!

let fileUrl = dir.appendingPathComponent("test.txt")

if FileManager.default.fileExists(atPath: fileUrl.path) {
  // ファイルが存在する場合の処理
}

FileManager.defaultにより、あらかじめ共有されているFileManagerクラスのインスタンスを利用できます。そのため、インスタンスを作成する必要はありません。
また、urlsメソッドにより、共有ディレクトリのパスを取得することができます。

fileExsists()メソッドのatPath引数はString型を指定しているため、.pathより、Stringに変換しています。

ファイルを新規に作成する

ファイルを新規作成する場合も、FileManagerクラスが利用できます。ここではcreateFile()を利用します。

let dir = FileManager.default.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!
let fileUrl = dir.appendingPathComponent("sample.txt")

// 新規ファイルを作成する
if FileManager.default.createFile(
                atPath: fileUrl.path,
                contents: text.data(using: .utf8),
                attributes: nil
                ) {
    messageLabel.text = "ファイルを新規作成しました。"
} else {
    messageLabel.text = "ファイルの新規作成に失敗しました。"
}

createFile()には3つの引数を受け渡しています。
atPath引数は作成先のパスをString型で渡します。URLのまま渡すことができないため、URL.pathで文字列に変換してから渡します。

contents引数では、作成するファイルに保存する内容がある場合、Data型で指定します。ない場合はnilでもOKです。

attributesでは、各種ファイルのメタデータを指定することができます。

文字列をテキストファイルに保存する

guard let text = textView.text else { return }

let dir = FileManager.default.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!
let fileUrl = dir.appendingPathComponent("test.txt")

// ファイルに書き込み
do {
    try text.write(to: fileUrl, atomically: false, encoding: .utf8)
} catch {
    print("Error: \(error)")
}

ここでは、UITextView内に記述された文字列をテキストファイルに保存しています。
保存にはString構造体のwrite()メソッドを利用しています。

to引数では、保存先のパスを渡しますが、ここではURL構造体のまま指定します。文字列ではないので注意します。

atomically引数にtrueを渡すと、補助ファイルを使用して書き込みます。具体的には、データを補助ファイルに書き込みし、それが完了した場合にto引数で指定した保存先にリネームされます。
補助ファイルを利用すると、書き込みに失敗した場合でもすでに存在する保存先のファイルが破損しません。
今回はfalseを指定しているため、直接指定した保存先に書き込みますが、必要に応じてtrueを指定するのが安全といえます。

最後に、encoding引数でエンコードを指定しています。

テキストファイルから文字列を読み出す

let dir = FileManager.default.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!
let fileUrl = dir.appendingPathComponent("sample.txt")

// テキストファイルから文字列を読み出し
do {
    let text = try String(contentsOf: fileUrl)
    textView.text = text
} catch {
    print("Error: \(error)")
}

文字列をテキストファイルから読み出す場合、String構造体のイニシャライザが利用できます。
to引数にURLのまま、読み込み対象のパスを渡します。

サンプルアプリ

この記事を作成するにあたり作成したサンプルアプリです。
Githubでソースコードを閲覧できます。

github.com

f:id:hitoridehitode:20190616174910p:plain

参考リンク

https://developer.apple.com/documentation/foundation/filemanager https://qiita.com/itoru257/items/6d31ba75cbc0f4c645f7