ディレクトリ名とは、何らかのファイルを指す場合には必ずディレクトリを指すことになる文字列のことである。ディレクトリは実際には一種のファイルであり、ファイル名(ディレクトリファイル名と呼ばれる)を持つ。このファイル名はディレクトリ名に関連しているが、通常は同一ではない。(これは一般的なPOSIXの用語法とは完全には一致しない。)同一の実体に対するこれら2つの名称は、構文的な変換によって関連付けられている。GNUやその他のPOSIX準拠システムでは、この処理は単純である。ディレクトリ名を得るには、末尾が‘/’で終わっていないディレクトリファイル名に、‘/’を付加すればよい。MS-DOSでは、この関係はより複雑である。
ディレクトリ名とディレクトリファイル名の違いはわずかですが、極めて重要です。Emacsの変数や関数の引数がディレクトリ名として記述されている場合、ディレクトリファイル名は許容されません。file-name-directory が文字列を返す場合、それは常にディレクトリ名となります。
以下の2つの関数は、ディレクトリ名とディレクトリファイル名を相互に変換します。これらの関数は、‘$HOME’のような環境変数の置換や、‘~’、‘.’、‘..’といった構文に対して、特別な処理は行いません。
この関数は、オペレーティングシステムがディレクトリ名(ディレクトリ名)として解釈する形式で、filenameを表す文字列を返します。ほとんどのシステムでは、これは文字列の末尾にスラッシュを付加することを意味します(末尾にスラッシュがない場合)。
(file-name-as-directory "~rms/lewis")
⇒ "~rms/lewis/"
この関数は、filename がディレクトリ区切り文字で終わっている場合に non-nil を返します。GNU やその他の POSIX 系システムでは、これはフォワードスラッシュ
‘/’ です。MS-Windows および MS-DOS
では、フォワードスラッシュとバックスラッシュ ‘\’
の両方をディレクトリ区切り文字として認識します。
この関数は、オペレーティングシステムがファイル名(ディレクトリファイル名)として解釈する形式で、dirname を表す文字列を返します。ほとんどのシステムでは、文字列がディレクトリ区切り文字のみで構成されていない限り、文字列の末尾にあるディレクトリ区切り文字を削除します。
(directory-file-name "~lewis/")
⇒ "~lewis"
componentsからdirectoryまでを連結し、directoryまたは直前のコンポーネントがスラッシュで終わっていない場合は、コンポーネントの前にスラッシュを挿入する。
(file-name-concat "/tmp" "foo")
⇒ "/tmp/foo"
directory や、nil
または空文字列であるコンポーネントは無視されます—まずフィルタリングされ、結果に一切影響を与えません。
これは concat を使うのとほぼ同じですが、dirname(および末尾以外のコンポーネント)はスラッシュ文字で終わる場合と終わらない場合があり、この関数ではそれらの文字を重複させません。
ほとんどの場合、expand-file-name への1回以上の呼び出し(ファイル名を展開する関数を参照)の方が、先頭にディレクトリを含むファイル名を生成する処理には本関数よりも適しています。expand-file-name
の特殊な機能の一部がプログラムの動作の妨げになる場合にのみ、本関数を使用してください。例えば、expand-file-name による ~、~user、nil の特殊な処理や、. および .. の削除などは、意図した動作ではない可能性があります。
ディレクトリ名を略称に変換するには、次の関数を使用します。
この関数は、filename の省略形を返します。directory-abbrev-alist で指定された省略形(The
GNU Emacs Manual の File
Aliases
を参照)を適用し、引数がホームディレクトリまたはそのサブディレクトリ内のファイルを指定している場合は、ユーザーのホームディレクトリを
‘~’
に置き換えます。ホームディレクトリがルートディレクトリである場合、多くのシステムで結果が短くならないため、‘~’ に置き換えられることはありません。
この関数は、名前の一部であっても略語を認識するため、ディレクトリ名とファイル名の両方に使用できます。
この関数は、filename の親ディレクトリのディレクトリ名を返します。 filename がファイルシステムのルートディレクトリにある場合は、nil を返します。 相対パスの filename は
default-directory
を基準とするものとみなされ、その場合の戻り値も相対パスになります。 戻り値が nil
以外の場合は、末尾にスラッシュがつきます。