Next: File Name Expansion, Previous: Relative File Names, Up: File Names [Contents][Index]
ディレクトリー名(directory name)とは、ディレクトリーの名前のことです。ディレクトリーは実際にはファイルの一種なので、ディレクトリーファイル名(directory file name)と呼ばれるファイル名をもちます。これはディレクトリー名と関連がありますが同一ではありません(これはUnixの通常の用語とは異なる)。同じ実体にたいするこれら2つの異なる名前は、構文的な変換により関連付けられます。GNUとUnixシステムでは事は単純です。ディレクトリーファイル名はスラッシュで終わり、ファイルとしてのディレクトリーの名前にはそのスラッシュがありません。MS-DOSではこの関連付けはより複雑です。
ディレクトリー名とディレクトリーファイル名の違いは些細ですが重要です。Emacsの変数や関数の引数を記述する際には、引数がディレクトリーだとみなしており、ディレクトリーファイル名は許容されません。file-name-directory
が文字列をリターンするときは、常にディレクトリー名をリターンします。
以下の2つの関数は、ディレクトリー名とディレクトリーファイル名の間で変換を行います。これらの関数は‘$HOME’のような環境変数や‘~’、‘.’、‘..’などの構文にたいして、特別なことは何も行いません。
この関数はオペレーティングシステムがディレクトリーの名前(ディレクトリー名)と解釈する形式でfilenameを表す文字列をリターンする。これはほとんどのシステムでは、(もし終端にそれがなければ)これは文字列にスラッシュを追加することを意味する。
(file-name-as-directory "~rms/lewis") ⇒ "~rms/lewis/"
この関数はfilenameがディレクトリー区切り文字で終れば非nil
をリターンする。これはUnixとGNUシステムでは順スラッシュ‘/’、MS-WindowsとMS-DOSでは順スラッシュとバックスラッシュ‘\’の両方がディレクトリー区切り文字として認識される。
この関数は、オペレーティングシステムがファイルの名前(ディレクトリーファイル名)として解釈する形式でdirnameを表す文字列をリターンする。ほとんどのシステムでは、これは文字列から最後のスラッシュ(またはバックスラッシュ)を削除することを意味する。
(directory-file-name "~lewis/") ⇒ "~lewis"
ディレクトリー名にたいしてはconcat
を使用して相対ファイルと組み合わせることができます:
(concat dirname relfile)
これを行う前にファイル名が相対的であることを確認してください。絶対ファイル名を使用すると構文的に不正な結果となったり、間違ったファイルを参照する可能性があります。
ディレクトリーファイル名の作成にこのような組み合わせを使用しなければ、最初にfile-name-as-directory
を使用してそれをディレクトリー名に変換しなければなりません:
(concat (file-name-as-directory dirfile) relfile)
以下のように手動でスラッシュの結合を試みてはなりません
;;; 間違い!
(concat dirfile "/" relfile)
なぜならこれには可搬性がないからです。常にfile-name-as-directory
を使用してください。
上述の問題の回避や(たとえばload-path
の要素のように)dirnameの値がnilかもしれない場合には、以下を使用してください:
(expand-file-name relfile dirname)
ディレクトリー名をディレクトリーの省略名に変換するには以下の関数を使用します:
この関数はfilenameの省略された形式をリターンする。
これはdirectory-abbrev-alist
(File Aliases in The GNU Emacs
Manualを参照)で指定される省略名を適用して、引数で与えられるファイル名ががホームディレクトリーかそのサブディレクトリーにあれば、ユーザーのホームディレクトリーを‘~’に置換する。ホームディレクトリーがルートディレクトリーなの場合には、多くのシステムでは結果が短縮されないので‘~’で置き換えない。
これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。