14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

ですね。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?