Code Aquarium

minazoko's blog -*- 水底のブログ -*-

Clojureでファイルパスの正規化

(def user-home-path (System/getProperty "user.home"))

(defn get-canonical-path [^String path]
  {:pre [path]}
  (-> (cond-> path (.startsWith path "~") (.replaceFirst "~" user-home-path))
      java.io.File. .getCanonicalPath))

ClojureというかJavaの仕様ですが、FileクラスのgetAbsolutePathは相対パス指定 . や .. を展開してくれません。代わりにメソッド getCanonicalPath を使います。
しかし、このメソッドもユーザーホームを表す ~ は正規化してくれませんのでこれに対応するには System Property から取得したユーザーホームパスで置き換える必要があります。

~ は本来シェルで解決すべきパス記号なのかもしれませんが、やっぱりコード上でも指定できた方が便利ですよね。