この記事では、Swift5(iOS)にて基本的なファイル操作のサンプルを紹介します。 また、この記事で作成したサンプルアプリのソースコードは Githubで閲覧できます。
ファイル操作
ファイルが存在するかどうか確認する
FileManager
のfileExists()
を利用します。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でソースコードを閲覧できます。
参考リンク
https://developer.apple.com/documentation/foundation/filemanager https://qiita.com/itoru257/items/6d31ba75cbc0f4c645f7