Операционная система группирует файлы в каталоги. Чтобы указать файл, необходимо указать каталог и имя файла внутри этого каталога. Поэтому Emacs рассматривает имя файла как состоящее из двух основных частей: части имени каталога и некаталоговой части (или имени файла внутри каталога). Любая из частей может быть пустой. Объединение этих двух частей воспроизводит исходное имя файла. 21
В большинстве систем часть каталога — это всё вплоть до и включая последний слеш (обратный слеш также допускается во вводе на MS-DOS или MS-Windows); некаталоговая часть — это всё остальное.
Для некоторых целей некаталоговая часть дополнительно подразделяется на собственно имя и номер версии. В большинстве систем только резервные файлы имеют номера версий в своих именах.
Эта функция возвращает часть каталога из filename в виде
имени каталога (см. Имена каталогов) или nil, если
filename не содержит часть каталога.
В GNU и других POSIX-подобных системах строка, возвращаемая этой функцией, всегда заканчивается слешем. На MS-DOS она также может заканчиваться двоеточием.
(file-name-directory "lewis/foo") ; Пример для GNU
⇒ "lewis/"
(file-name-directory "foo") ; Пример для GNU
⇒ 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"
Эта функция возвращает конечное расширение filename, если оно есть,
после применения file-name-sans-versions для удаления любой
части версии/резервной копии. Расширение в имени файла — это часть,
следующая за последним ‘.’ в последнем компоненте имени (за вычетом
любой части версии/резервной копии).
Эта функция возвращает nil для имён файлов без расширения, например
foo. Она возвращает "" для пустых расширений, как в
foo.. Если последний компонент имени файла начинается с
‘.’, эта ‘.’ не считается началом расширения.
Таким образом, расширение .emacs равно nil, а не
‘.emacs’.
Если period не равен nil, то возвращаемое значение включает
точку, которая ограничивает расширение, и если filename не имеет
расширения, значением будет "".
Эта функция возвращает 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).
Эта функция возвращает 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-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 использовать термин имя файла вместо термина путь. Мы используем термин путь только для путей поиска, которые являются списками имён каталогов.