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