Все каталоги в файловой системе образуют дерево, начинающееся с корневого каталога. Имя файла может указывать все имена каталогов, начиная с корня дерева; тогда оно называется абсолютным именем файла. Или оно может указывать положение файла в дереве относительно каталога по умолчанию; тогда оно называется относительным именем файла. В системах GNU и других, подобных POSIX, после расширения любого ведущего символа ‘~’ абсолютное имя файла начинается с ‘/’ (см. abbreviate-file-name), а относительное — нет. В MS-DOS и MS-Windows абсолютное имя файла начинается с косой или обратной косой черты, или с указания диска ‘x:/’, где x — буква диска.
Эта функция возвращает t, если файл filename является абсолютным именем файла, и nil в противном случае. Имя файла считается абсолютным, если его первый компонент — ‘~’, или ‘~user’, где user — допустимое имя входа. В следующих примерах предполагается, что существует пользователь с именем ‘rms’, но нет пользователя с именем ‘nosuchuser’.
(file-name-absolute-p "~rms/foo")
⇒ t
(file-name-absolute-p "~nosuchuser/foo")
⇒ nil
(file-name-absolute-p "rms/foo")
⇒ nil
(file-name-absolute-p "/user/rms/foo")
⇒ t
При заданном, возможно, относительном имени файла вы можете расширить любой ведущий символ ‘~’ и преобразовать результат в абсолютное имя с помощью expand-file-name (см. Функции, расширяющие имена файлов). Эта функция преобразует абсолютные имена файлов в относительные:
Эта функция пытается вернуть относительное имя, эквивалентное filename, предполагая, что результат будет интерпретироваться относительно directory (абсолютное имя каталога или имя файла каталога). Если directory опущен или равен nil, по умолчанию используется каталог по умолчанию текущего буфера.
В некоторых операционных системах абсолютное имя файла начинается с имени устройства. В таких системах filename не имеет относительного эквивалента на основе directory, если они начинаются с двух разных имен устройств. В этом случае file-relative-name возвращает filename в абсолютной форме.
(file-relative-name "/foo/bar" "/foo/")
⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
⇒ "../foo/bar"
Имя файла, представляющее собой пустую строку, обозначает каталог по умолчанию текущего буфера.