[Common Lisp] PATHNAMEから情報を取得
わたくし、本職はJavaプログラマなのですが「ファイルのパスを受け取ってゴニョゴニョする」ことがそれなりにあるなーと思いました。具体的に言うと
- ファイルのフルパスからファイル名を取得
- ファイルのフルパスから拡張子を取得
は結構頻繁にやっている気がします。フルパスの後ろのほうからディレクトリ区切り文字なり、ドットなりの位置を探して それ以降を取得って感じ。
Javaでやってることは、Common Lispでどうやるのかなーと思ったので、後のために書いておきます。
;; pathname からファイル名を取得 (file-namestring #P"/tmp/hoge.tgz") ;; => "hoge.tgz" ;; pathname から拡張子を取得 (pathname-type #P"/tmp/hoge.tgz") ;; => "tgz" ;; pathname からファイル名(拡張子無し)を取得 (pathname-name #P"/tmp/hoge.tgz") ;; => "hoge" ;; pathname からディレクトリを取得 (pathname-directory #P"/tmp/hoge.tgz") ;; => (:ABSOLUTE "tmp") (pathname-directory #P"tmp/hoge.tgz") ;; => (:RELATIVE "tmp") ;; pathname からドライブレターを取得 (pathname-device #P"D:/tmp/hoge.tgz") ;; => "D"
(pathname-directory) は戻り値の carを見ると、渡したpathnameが相対パスか絶対パスか分かるのですね。
ちなみに Windowsの絶対パスにはドライブレターが付きますが、これは (pathname-directory) では返ってきませんでした。