Next: File Name Expansion, Previous: Relative File Names, Up: File Names [Contents][Index]
ディレクトリー名(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"
ディレクトリー名にたいしてはconcat
を使用して相対ファイルと組み合わせることができます:
(concat dirname relfile)
これを行う前にファイル名が相対的であることを確認してください。絶対ファイル名を使用すると構文的に不正な結果となったり、間違ったファイルを参照する可能性があります。
ディレクトリーファイル名の作成にこのような組み合わせを使用しなければ、最初にfile-name-as-directory
を使用してそれをディレクトリー名に変換しなければなりません:
(concat (file-name-as-directory dirfile) relfile)
以下のように手動でスラッシュの結合を試みてはなりません
;;; 間違い!
(concat dirfile "/" relfile)
なぜならこれには可搬性がないからです。常にfile-name-as-directory
を使用してください。
上述の問題の回避やdirnameの値がnil
かもしれない場合(たとえばload-path
の要素を使用する際)には以下を使用します:
(expand-file-name relfile dirname)
ただしexpand-file-name
はrelfileの先頭の‘~’を展開しますが、これは望んだ動作ではないかもしれません。File Name Expansionを参照してください。
ディレクトリー名をディレクトリーの省略名に変換するには以下の関数を使用します:
この関数はfilenameの省略された形式をリターンする。
これはdirectory-abbrev-alist
(File Aliases in The GNU Emacs
Manualを参照)で指定される省略名を適用して、引数で与えられるファイル名ががホームディレクトリーかそのサブディレクトリーにあれば、ユーザーのホームディレクトリーを‘~’に置換する。ホームディレクトリーがルートディレクトリーなの場合には、多くのシステムでは結果が短縮されないので‘~’で置き換えない。
これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。