26.9.1 Компоненты имени файла

Операционная система группирует файлы в каталоги. Чтобы указать файл, необходимо указать каталог и имя файла внутри этого каталога. Поэтому Emacs рассматривает имя файла как состоящее из двух основных частей: части имени каталога и некаталоговой части (или имени файла внутри каталога). Любая из частей может быть пустой. Объединение этих двух частей воспроизводит исходное имя файла. 21

В большинстве систем часть каталога — это всё вплоть до и включая последний слеш (обратный слеш также допускается во вводе на MS-DOS или MS-Windows); некаталоговая часть — это всё остальное.

Для некоторых целей некаталоговая часть дополнительно подразделяется на собственно имя и номер версии. В большинстве систем только резервные файлы имеют номера версий в своих именах.

Функция: file-name-directory filename

Эта функция возвращает часть каталога из filename в виде имени каталога (см. Имена каталогов) или nil, если filename не содержит часть каталога.

В GNU и других POSIX-подобных системах строка, возвращаемая этой функцией, всегда заканчивается слешем. На MS-DOS она также может заканчиваться двоеточием.

(file-name-directory "lewis/foo")  ; Пример для GNU
     ⇒ "lewis/"
(file-name-directory "foo")        ; Пример для GNU
     ⇒ nil
Функция: file-name-nondirectory filename

Эта функция возвращает некаталоговую часть filename.

(file-name-nondirectory "lewis/foo")
     ⇒ "foo"
(file-name-nondirectory "foo")
     ⇒ "foo"
(file-name-nondirectory "lewis/")
     ⇒ ""
Функция: file-name-sans-versions filename &optional keep-backup-version

Эта функция возвращает 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-extension filename &optional period

Эта функция возвращает конечное расширение filename, если оно есть, после применения file-name-sans-versions для удаления любой части версии/резервной копии. Расширение в имени файла — это часть, следующая за последним ‘.’ в последнем компоненте имени (за вычетом любой части версии/резервной копии).

Эта функция возвращает nil для имён файлов без расширения, например foo. Она возвращает "" для пустых расширений, как в foo.. Если последний компонент имени файла начинается с ‘.’, эта ‘.’ не считается началом расширения. Таким образом, расширение .emacs равно nil, а не ‘.emacs’.

Если period не равен nil, то возвращаемое значение включает точку, которая ограничивает расширение, и если filename не имеет расширения, значением будет "".

Функция: file-name-with-extension filename extension

Эта функция возвращает filename с расширением, установленным в extension. Начальная точка в extension будет удалена, если она присутствует. Например:

(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).

Функция: file-name-sans-extension filename

Эта функция возвращает 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~"

Обратите внимание, что ‘.~3~’ в двух последних примерах — это часть резервной копии, а не расширение.

Функция: file-name-base filename

Эта функция является композицией file-name-sans-extension и file-name-nondirectory. Например,

(file-name-base "/my/home/foo.c")
    ⇒ "foo"
Функция: file-name-split filename

Эта функция разбивает имя файла на компоненты и может рассматриваться как обратная к string-join с соответствующим разделителем каталогов. Например,

(file-name-split "/tmp/foo.txt")
    ⇒ ("" "tmp" "foo.txt")
(string-join (file-name-split "/tmp/foo.txt") "/")
    ⇒ "/tmp/foo.txt"

Сноски

(21)

Emacs следует соглашению GNU использовать термин имя файла вместо термина путь. Мы используем термин путь только для путей поиска, которые являются списками имён каталогов.