Next: , Previous: , Up: File Names   [Contents][Index]


24.8.3 ディレクトリーの名前

ディレクトリー名(directory name)とは、ディレクトリーの名前のことです。ディレクトリーは実際にはファイルの一種なので、ファイル名をもちます。これはディレクトリー名と関連がありますが、同一ではありません(これは、Unixの通常の用語とは異なる)。同じ実体にたいするこれら2つの異なる名前は、構文的な変換により関連付けられます。GNUおよびUnixシステムでは、ことは単純です。ディレクトリー名はスラッシュで終わり、ファイルとしてのディレクトリーの名前には、そのスラッシュがありません。MS-DOSでは、この関連付けはより複雑です。

ディレクトリー名と、ファイルとしてのディレクトリーの名前の違いは、些細ですが重要です。Emacsの変数、または関数の引数を記述する際、それがディレクトリー名であるとしており、ディレクトリーのファイル名は許されません。file-name-directoryが文字列をリターンするときは、常にディレクトリー名です。

以下の2つの関数は、ディレクトリー名とファイル名の間で変換を行います。これらの関数は、‘$HOME’のような環境変数や、‘~’、‘.’、‘..’などの構文にたいして、特別なことは何も行いません。

Function: file-name-as-directory filename

この関数は、オペレーティングシステムがディレクトリーの名前と解釈する形式で、filenameを表す文字列をリターンする。ほとんどのシステムでは、(もし終端にそれがなければ)これは文字列にスラッシュを追加することを意味する。

(file-name-as-directory "~rms/lewis")
     ⇒ "~rms/lewis/"
Function: directory-file-name dirname

この関数は、オペレーティングシステムがファイルの名前と解釈する形式で、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を使用してください。

ディレクトリー名をディレクトリーの省略名に変換するには以下の関数を使用します:

Function: abbreviate-file-name filename

この関数はfilenameの省略された形式をリターンする。 これはdirectory-abbrev-alist (File Aliases in The GNU Emacs Manualを参照)で指定される省略名を適用して、引数で与えられるファイル名ががホームディレクトリーかそのサブディレクトリーにあれば、ユーザーのホームディレクトリーを‘~’に置換する。ホームディレクトリーがルートディレクトリーなの場合には、多くのシステムでは結果が短縮されないので‘~’で置き換えない。

これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。