Spec-Zone.ru › Elisp

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

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

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

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

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

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

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

(file-name-directory "lewis/foo")  ; GNU example
     ⇒ "lewis/"
(file-name-directory "foo")        ; GNU example
     ⇒ 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"

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API