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

  • 10
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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:相対パスを使いたい理由があるときにしか使わなさそう。

ですね。