Scalaでパスを分割

Javaってドライブとか拡張子を扱うAPIがないです。
そういえば、DOSの頃にはCのライブラリに_splitpath()がありました。
アレは便利でした。
なので、Scalaで作ってみました。多値が返せるのはうれしい。

    /**
        パスを分割する。
        """C:\dir\dir\dir\filename.ext"""   => ("C:", """\dir\dir\dir\""", "filename", ".ext")
        """C:/dir/dir/dir/filename.ext"""   => ("C:", """/dir/dir/dir/""", "filename", ".ext")
        "/dir/dir/dir/filename.ext"         => ("", "/dir/dir/dir/", "filename", ".ext")
        "filename.ext"                      => ("", "", "filename", ".ext")
        "filename"                          => ("", "", "filename", "")
    */
    def splitPath(fname:String):(String, String, String, String) = {
        var drive = ""
        var path = ""
        var name = fname
        var ext = ""
        val drive_pos = name.indexOf(':')
        if (drive_pos != -1) {
            drive = name.substring(0, drive_pos+1)
            name = name.substring(drive_pos+1)
        }
        val path_pos = Math.max(name.lastIndexOf('\\'), name.lastIndexOf('/'))
        if (path_pos != -1) {
            path = name.substring(0, path_pos+1)
            name = name.substring(path_pos+1)
        }
        val ext_pos = name.lastIndexOf('.')
        if (ext_pos != -1) {
            ext = name.substring(ext_pos)
            name = name.substring(0, ext_pos)
        }
        (drive, path, name, ext)
    }

使うときはこんな感じ。

    val (_,_,name,_) = splitPath("""C:\dir\dir\dir\filename.ext""")

興味のない部分は _ にすれば、余分な変数は使わずに済みます。
元のパスに戻すには、結果の文字列をすべて足せば戻るようにしています。
なので、拡張子には"."が付いていたり、パスの末尾にも"\"が付きます。