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 から取得したユーザーホームパスで置き換える必要があります。
~ は本来シェルで解決すべきパス記号なのかもしれませんが、やっぱりコード上でも指定できた方が便利ですよね。