All the directories in the file system form a tree starting at the root directory. A file name can specify all the directory names starting from the root of the tree; then it is called an absolute file name. Or it can specify the position of the file in the tree relative to a default directory; then it is called a relative file name. On GNU and other POSIX-like systems, after any leading ‘~’ has been expanded, an absolute file name starts with a ‘/’ (see abbreviate-file-name), and a relative one does not. On MS-DOS and MS-Windows, an absolute file name starts with a slash or a backslash, or with a drive specification ‘x:/’, where x is the drive letter.
This function returns t
if file filename is an absolute
file name, nil
otherwise. A file name is considered to be
absolute if its first component is ‘~’, or is ‘~user’
where user is a valid login name. In the following examples,
assume that there is a user named ‘rms’ but no user named
‘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
Given a possibly relative file name, you can expand any
leading ‘~’ and convert the result to an
absolute name using expand-file-name
(see Functions that Expand Filenames). This function converts absolute file names to relative
names:
This function tries to return a relative name that is equivalent to
filename, assuming the result will be interpreted relative to
directory (an absolute directory name or directory file name).
If directory is omitted or nil
, it defaults to the
current buffer’s default directory.
On some operating systems, an absolute file name begins with a device
name. On such systems, filename has no relative equivalent based
on directory if they start with two different device names. In
this case, file-relative-name
returns filename in absolute
form.
(file-relative-name "/foo/bar" "/foo/") ⇒ "bar" (file-relative-name "/foo/bar" "/hack/") ⇒ "../foo/bar"
A file name that is an empty string stands for the current buffer’s default directory.