26.9.3 Имена каталогов

Имя каталога — это строка, которая должна указывать на каталог, если она указывает на какой-либо файл. Каталог на самом деле является своего рода файлом и имеет имя файла (называемое именем файла каталога), которое связано с именем каталога, но обычно не совпадает. (Это не совсем то же самое, что обычная терминология POSIX.) Эти два имени для одного и того же объекта связаны синтаксической трансформацией. В системах GNU и других, подобных POSIX, это просто: чтобы получить имя каталога, добавьте «/» к имени файла каталога, которое еще не заканчивается на «/». В MS-DOS взаимосвязь более сложная.

Разница между именем каталога и именем файла каталога тонкая, но критически важная. Когда переменная Emacs или аргумент функции описывается как имя каталога, имя файла каталога неприемлемо. Когда file-name-directory возвращает строку, это всегда имя каталога.

Следующие две функции преобразуют между именами каталогов и именами файлов каталогов. Они не выполняют никаких специальных преобразований подстановок переменных окружения, таких как «$HOME», и конструкций «~», «.» и «..».

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

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

(file-name-as-directory "~rms/lewis")
     ⇒ "~rms/lewis/"
Функция: directory-name-p filename

Эта функция возвращает не-nil, если filename заканчивается символом разделителя каталогов. В GNU и других системах, подобных POSIX, это прямой слэш «/`; в MS-Windows и MS-DOS распознаются как прямой слэш, так и обратный слэш «\» в качестве разделителей каталогов.

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

Эта функция возвращает строку, представляющую dirname в форме, которую операционная система интерпретирует как имя файла (имя файла каталога). В большинстве систем это означает удаление конечных разделителей каталогов из строки, если только строка не состоит целиком из разделителей каталогов.

(directory-file-name "~lewis/")
     ⇒ "~lewis"
Функция: file-name-concat directory &rest components

Конкатенирует components к directory, вставляя слэш перед компонентами, если directory или предыдущий компонент не заканчивался слэшем.

(file-name-concat "/tmp" "foo")
     ⇒ "/tmp/foo"

Переменные directory или компоненты, равные nil или пустой строке, игнорируются — они сначала отфильтровываются и никак не влияют на результат.

Это почти то же самое, что и использование concat, но dirname (и нефинальные компоненты) могут или не могут заканчиваться символами слэша, и эта функция не будет дублировать эти символы.

В большинстве случаев одна или несколько вызовов expand-file-name (см. Функции расширения имен файлов) лучше подходят для задачи генерации имен файлов с ведущими каталогами, чем эта функция. Используйте эту функцию только в том случае, если некоторые специальные возможности expand-file-name мешают тому, что должна делать ваша программа. Например, специальная обработка expand-file-name для ~, ~user и nil, или удаление . и .. может быть не тем, что вам нужно.

Чтобы преобразовать имя каталога в его сокращенную форму, используйте эту функцию:

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

Эта функция возвращает сокращенную форму filename. Она применяет сокращения, указанные в directory-abbrev-alist (см. Алиасы файлов в Руководство GNU Emacs), затем заменяет «~» домашним каталогом пользователя, если аргумент указывает на файл в домашнем каталоге или в одном из его подкаталогов. Если домашний каталог является корневым каталогом, он не заменяется на «~», потому что это не делает результат короче во многих системах.

Вы можете использовать эту функцию для имен каталогов и для имен файлов, потому что она распознает сокращения даже в составе имени.

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

Эта функция возвращает имя каталога родительского каталога filename. Если filename находится в корневом каталоге файловой системы, она возвращает nil. Относительное filename предполагается относительным к default-directory, и возвращаемое значение также будет относительным в этом случае. Если возвращаемое значение не-nil, оно заканчивается слэшем.