オペレーティングシステムは、ファイルをディレクトリにまとめます。ファイルを指定するには、ディレクトリと、そのディレクトリ内のファイル名を指定する必要があります。そのため、Emacsではファイル名を、ディレクトリ名部分と非ディレクトリ部分(またはディレクトリ内のファイル名)という2つの主要な部分で構成されるものとして扱います。どちらの部分も空であっても構いません。これら2つの部分を連結すると、元のファイル名が再現されます。23
ほとんどのシステムでは、ディレクトリ部分は最後のスラッシュ(MS-DOSやMS-Windowsの入力ではバックスラッシュも許容される)まで(それを含む)のすべてを指し、非ディレクトリ部分はそれ以外の部分を指します。
用途によっては、ディレクトリ以外の部分がさらに固有名とバージョン番号に細分化されます。ほとんどのシステムでは、バックアップファイルのみが名前にバージョン番号を含んでいます。
この関数は、filename のディレクトリ部分をディレクトリ名(ディレクトリ名を参照)として返すか、filename にディレクトリ部分が含まれていない場合は nil を返します。
GNUやその他のPOSIX準拠システムでは、この関数が返す文字列は必ずスラッシュで終わります。MS-DOSでは、コロンで終わることもあります。
(file-name-directory "lewis/foo") ; GNU example
⇒ "lewis/"
(file-name-directory "foo") ; GNU example
⇒ nil
この関数は、filename のディレクトリ以外の部分を返します。
(file-name-nondirectory "lewis/foo")
⇒ "foo"
(file-name-nondirectory "foo")
⇒ "foo"
(file-name-nondirectory "lewis/")
⇒ ""
この関数は、ファイルバージョン番号、バックアップバージョン番号、または末尾のチルダを破棄した上で、filenameを返します。
keep-backup-version が nil
でない場合、ファイルシステムがそのように認識する真のファイルバージョン番号は戻り値から除外されますが、バックアップバージョン番号は保持されます。
(file-name-sans-versions "~rms/foo.~1~")
⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~")
⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo")
⇒ "~rms/foo"
この関数は、file-name-sans-versionsを適用してバージョンやバックアップ部分を除去した後、filenameの最終的な拡張子(存在する場合)を返します。ファイル名における拡張子とは、最後の名前構成要素にある最後の‘.’に続く部分(バージョンやバックアップ部分を除く)のことです。
この関数は、foo のような拡張子のないファイル名に対して nil を返します。foo. のように拡張子が null
の場合は "" を返します。ファイル名の最後の構成要素が
‘.’ で始まる場合、その ‘.’ は拡張子の開始とはみなされません。したがって、.emacs の拡張子は ‘.emacs’ ではなく nil となります。
period が nil
でない場合、返される値には拡張を区切るピリオドが含まれ、filename に拡張がない場合は、値は
"" となります。
この関数は、拡張子を extension に設定した filename を返します。extension の先頭にドットが1つある場合は、それが削除されます。例えば:
(file-name-with-extension "file" "el")
⇒ "file.el"
(file-name-with-extension "file" ".el")
⇒ "file.el"
(file-name-with-extension "file.c" "el")
⇒ "file.el"
なお、filename または extension
が空である場合、あるいは filename がディレクトリのような形式である場合(すなわち、directory-name-p が nil
以外を返す場合)、この関数はエラーとなります。
この関数は、filenameから拡張子(存在する場合)を差し引いた値を返します。バージョン/バックアップ部分は、ファイルに拡張子がある場合にのみ削除されます。例えば、
(file-name-sans-extension "foo.lose.c")
⇒ "foo.lose"
(file-name-sans-extension "big.hack/foo")
⇒ "big.hack/foo"
(file-name-sans-extension "/my/home/.emacs")
⇒ "/my/home/.emacs"
(file-name-sans-extension "/my/home/.emacs.el")
⇒ "/my/home/.emacs"
(file-name-sans-extension "~/foo.el.~3~")
⇒ "~/foo"
(file-name-sans-extension "~/foo.~3~")
⇒ "~/foo.~3~"
なお、最後の2つの例における ‘.~3~’ はバックアップ部分であり、拡張ではありません。
この関数は file-name-sans-extension と file-name-nondirectory の合成です。 例えば、
(file-name-base "/my/home/foo.c")
⇒ "foo"
この関数はファイル名を構成要素に分割するもので、適切なディレクトリ区切り文字を用いた string-join の逆操作と考えることができます。例えば、
(file-name-split "/tmp/foo.txt")
⇒ ("" "tmp" "foo.txt")
(string-join (file-name-split "/tmp/foo.txt") "/")
⇒ "/tmp/foo.txt"
EmacsはGNUの慣例に従い、pathnameという用語の代わりにfile nameという用語を使用しています。pathという用語は、ディレクトリ名のリストである検索パスに対してのみ使用します。