Имя каталога — это строка, которая должна указывать на каталог, если она указывает на какой-либо файл. Каталог на самом деле является своего рода файлом и имеет имя файла (называемое именем файла каталога), которое связано с именем каталога, но обычно не совпадает. (Это не совсем то же самое, что обычная терминология POSIX.) Эти два имени для одного и того же объекта связаны синтаксической трансформацией. В системах GNU и других, подобных POSIX, это просто: чтобы получить имя каталога, добавьте «/» к имени файла каталога, которое еще не заканчивается на «/». В MS-DOS взаимосвязь более сложная.
Разница между именем каталога и именем файла каталога тонкая, но критически важная. Когда переменная Emacs или аргумент функции описывается как имя каталога, имя файла каталога неприемлемо. Когда file-name-directory возвращает строку, это всегда имя каталога.
Следующие две функции преобразуют между именами каталогов и именами файлов каталогов. Они не выполняют никаких специальных преобразований подстановок переменных окружения, таких как «$HOME», и конструкций «~», «.» и «..».
Эта функция возвращает строку, представляющую filename в форме, которую операционная система интерпретирует как имя каталога (имя каталога). В большинстве систем это означает добавление слэша к строке (если она еще не заканчивается на него).
(file-name-as-directory "~rms/lewis")
⇒ "~rms/lewis/"
Эта функция возвращает не-nil, если filename заканчивается символом разделителя каталогов. В GNU и других системах, подобных POSIX, это прямой слэш «/`; в MS-Windows и MS-DOS распознаются как прямой слэш, так и обратный слэш «\» в качестве разделителей каталогов.
Эта функция возвращает строку, представляющую dirname в форме, которую операционная система интерпретирует как имя файла (имя файла каталога). В большинстве систем это означает удаление конечных разделителей каталогов из строки, если только строка не состоит целиком из разделителей каталогов.
(directory-file-name "~lewis/")
⇒ "~lewis"
Конкатенирует 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, или удаление . и .. может быть не тем, что вам нужно.
Чтобы преобразовать имя каталога в его сокращенную форму, используйте эту функцию:
Эта функция возвращает сокращенную форму filename. Она применяет сокращения, указанные в directory-abbrev-alist (см. Алиасы файлов в Руководство GNU Emacs), затем заменяет «~» домашним каталогом пользователя, если аргумент указывает на файл в домашнем каталоге или в одном из его подкаталогов. Если домашний каталог является корневым каталогом, он не заменяется на «~», потому что это не делает результат короче во многих системах.
Вы можете использовать эту функцию для имен каталогов и для имен файлов, потому что она распознает сокращения даже в составе имени.
Эта функция возвращает имя каталога родительского каталога filename. Если filename находится в корневом каталоге файловой системы, она возвращает nil. Относительное filename предполагается относительным к default-directory, и возвращаемое значение также будет относительным в этом случае. Если возвращаемое значение не-nil, оно заканчивается слэшем.