Posted at

File#getCanonicalPath()とFile#getAbsolutePath()とFile#getPathとの違い 絶対パスにも"."や".."が入ります

More than 5 years have passed since last update.

File#getAbsolutePath()のAPI仕様には


この抽象パス名の絶対パス名文字列を返します。


とあるのですが、

私は「絶対パス = "."や".."が入らないパス」くらいの認識だったのに、

File#getAbsolutePath()で返ってくるファイルパスにも

1つ上のディレクトリを表す".."が入ってきて意外だったことがあったのでこの記事を書きました。

API仕様を読んだりコードを動かしたりすると、次のことが分かりました。

メソッド名

new File("../file")のオブジェクトで呼んだときの戻り値(現在のディレクトリは/foo/bar/)
備考

getCanonicalPath
/foo/file
正規パス。"."や".."を解決する。シンボリックリンクを解決する。IOExceptionをスローする

getAbsolutePath
/foo/bar/../file
絶対パス。"."や".."が入りうる

getPath
../file
相対パスの時も絶対パスの時もある。たとえばnew File("/file")で呼べば絶対パスになる

こう並べてみると、次のようにまとめられます。


  • File#getCanonicalPath():返ってくるファイルパスを想像しやすい。シンボリックリンクを解決するので、シンボリックリンクとリンク先のファイルとでアクセス権を変えてあるのを忘れているときに厄介なことになりそう。IOExceptionをスローしているので面倒。

  • File#getAbsolutePath:一番まとも。"."や".."が入ってくることがあるけれど、大抵の場合に支障はない(?)

  • File#getPath:相対パスを使いたい理由があるときにしか使わなさそう。

ですね。