ディレクトリー名(directory name)とは、ある文字列が何らかのファイルを命名する場合にはディレクトリーを命名する文字列のことです。ディレクトリーは実際にはファイルの一種なので、ファイル名(ディレクトリーファイル名と呼ばれる)をもち、これはディレクトリー名と関係はあるものの通常は等価ではありません(これはPOSIXの通常の用語と完全に同一ではない)。同じ実体にたいするこれら2つの異なる名前は構文的な変換により関連付けられます。GNUや他のPOSIXシステムではことは単純です。ディレクトリー名の最後が‘/’でなければ、ディレクトリーファイル名に‘/’を追加してディレクトリー名を取得できます。MS-DOSではこの関連付けはより複雑です。
ディレクトリー名とディレクトリーファイル名の違いは些細ですが重要です。Emacsの変数や関数の引数を記述する際には、それがディレクトリー名であるとしており、ディレクトリーファイル名は許容されません。file-name-directoryが文字列をリターンするときには常にディレクトリー名をリターンします。
以下の2つの関数は、ディレクトリー名とディレクトリーファイル名の間で変換を行います。これらの関数は‘$HOME’のような環境変数や‘~’、‘.’、‘..’などの構文にたいして、特別なことは何も行いません。
この関数はオペレーティングシステムがディレクトリーの名前(ディレクトリー名)と解釈する形式でfilenameを表す文字列をリターンする。これはほとんどのシステムでは、(もし終端にそれがなければ)これは文字列にスラッシュを追加することを意味する。
(file-name-as-directory "~rms/lewis")
⇒ "~rms/lewis/"
この関数はfilenameの終端がディレクトリー区切り文字なら非nilをリターンする。これはGNUや他のPOSIX準拠システムではスラッシュ‘/’、MS-WindowsとMS-DOSではスラッシュとバックスラッシュ‘\’がディレクトリー区切りとして認識される。
この関数はオペレーティングシステムがファイルの名前と解釈する形式(ディレクトリーファイル名)でdirnameを表す文字列をリターンする。ほとんどのシステムではこれは文字列すべてがディレクトリー区切り文字で構成されている場合を除き、文字列から最後のディレクトリー区切り文字を削除することを意味する。
(directory-file-name "~lewis/")
⇒ "~lewis"
directoryまたは前置されるコンポーネントがスラッシュで終端されていなければコンポーネントの前にスラッシュを挿入して、directoryにcomponentsを結合する。
(file-name-concat "/tmp" "foo")
⇒ "/tmp/foo"
componentsや空文字列のdirectoryやコンポーネントは無視する。これらは最初に除外されて、結果に影響することはない。
この関数はconcatを使用するのとほとんど同じだが、dirname(と最後のコンポーネント)がスラッシュで終端されているか否かに関わらずスラッシュ文字を2重に連結することはない点が異なる。
In most cases, one or more calls to expand-file-name (see ファイル名を展開する関数 are better suited for the job of generating file names with
leading directories than this function. Use this function only if some of
the special features of expand-file-name get in the way of what your
program needs to do. For example, the special handling by
expand-file-name of ~, ~user, and nil, or
the removal of . and .. might not be what you want.
ディレクトリー名をディレクトリーの省略名に変換するには以下の関数を使用します:
この関数はfilenameの省略された形式をリターンする。
これはdirectory-abbrev-alist (File Aliases in The GNU Emacs
Manualを参照)で指定される省略名を適用して、引数で与えられるファイル名ががホームディレクトリーかそのサブディレクトリーにあれば、ユーザーのホームディレクトリーを‘~’に置換する。ホームディレクトリーがルートディレクトリーなの場合には、多くのシステムでは結果が短縮されないので‘~’で置き換えない。
これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。
この関数はfilenameの親ディレクトリーのディレクトリー名をリターンする。filenameがソンファイルシステムのルートディレクトリーにある場合にはnilをリターンする。相対的なfilenameの場合にはdefault-directoryから相対的なディレクトリーとみなし、リターンされる値も相対的なディレクトリー名となる。リターン値が非nilならスラッシュで終端される。