[iOSアプリ開発] ファイルを抽象化した構造体を作る(7)

2 min読了の目安(約2300字TECH技術記事

こんにちは。
ZennではiOSアプリ開発の普段自分が使っているちょっとしたTipsなどを書いていければと思っております。

今回はSwiftでは少し冗長になりがちなファイルの操作を簡単にするために "ファイルを抽象化した構造体" を作っていきます。
当記事だけで終わりというわけではなく、続き物にしていく予定なのでよろしくおねがいします。

前回まではこちら

https://zenn.dev/nkysyuichi/articles/467ddcc1041d4e
https://zenn.dev/nkysyuichi/articles/7269df712386ed
https://zenn.dev/nkysyuichi/articles/2c44e971f7afac
https://zenn.dev/nkysyuichi/articles/bcc71f9eeabf1f
https://zenn.dev/nkysyuichi/articles/0689c909bcffb4
https://zenn.dev/nkysyuichi/articles/1ffb9ef3a0af64

ファイルを取り扱う構造体

今回はファイルを操作する処理を書いていきます。
ファイルを操作するということは基本的には throws をつけることになります。操作しようとするときにキチンと例外処理は考慮したいところですからね。

ファイル削除

extension File {

    func delete() throws {
        try FileManager.default.removeItem(atPath: path)
    }
}

単純にFileManagerの削除処理をラップしたものです。

使い方

このように非常にシンプルかつ明快です。

let file = File(path: "path/to/")
try? file.delete()

ディレクトリ内ファイル全削除

extension File {

    func deleteAllChildren() throws {
        try files.forEach { file in
            try file.delete()
        }
    }
}

前回までに作ったfilesを使用し、ディレクトリ内のファイルのすべての削除を試みます。(メソッド名がちょっと物騒ですね・・)

ファイルのコピー

extension File {

    func copy(to destination: File, force: Bool = true) throws {
        if force && destination.exists {
            try destination.delete()
        }
        try FileManager.default.copyItem(atPath: path, toPath: destination.path)
    }
}

こちらもFileManagerのラップですが、単純にコピーだけをするとコピー先が存在していた場合にエラーが吐かれてしまいます。

使用者がそのエラーを享受するかどうかを選択できるように「強制コピーするかどうか」の引数を渡せるようにしています。
強制コピーする場合はコピー先ファイルを削除してからコピーすることで、先述のエラーを回避するというわけです。

ファイルの移動

extension File {

    func move(to destination: File, force: Bool = true) throws {
        if force && destination.exists {
            try destination.delete()
        }
        try FileManager.default.moveItem(atPath: path, toPath: destination.path)
    }
}

コピーとほぼ同様です。移動ですので、元々のパスのファイルはなくなる動きをします。

ファイルのリネーム

extension File {

    func rename(to name: String, force: Bool = true) throws -> File {
        let destination = File(path: parentDirectoryPath) + name
        try move(to: destination, force: force)
        return destination
    }
}

移動の応用編としてリネームのメソッドも定義しました。リネームとはつまり「同ディレクトリへのファイル移動」として処理をするわけです。

まとめ

  • ファイルの削除、コピー、移動をできるようにした
  • 移動を応用することでリネームをできるようにした

というわけで、ファイル操作もシンプルにできるようになりました。

それでは、また。