A directory name is the name of a directory. A directory is actually a kind of file, so it has a file name, which is related to the directory name but not identical to it. (This is not quite the same as the usual Unix terminology.) These two different names for the same entity are related by a syntactic transformation. On GNU and Unix systems, this is simple: a directory name ends in a slash, whereas the directory’s name as a file lacks that slash. On MS-DOS the relationship is more complicated.
The difference between a directory name and its name as a file is
subtle but crucial. When an Emacs variable or function argument is
described as being a directory name, a file name of a directory is not
file-name-directory returns a string, that is
always a directory name.
The following two functions convert between directory names and file names. They do nothing special with environment variable substitutions such as ‘$HOME’, and the constructs ‘~’, ‘.’ and ‘..’.
This function returns a string representing filename in a form that the operating system will interpret as the name of a directory. On most systems, this means appending a slash to the string (if it does not already end in one).
(file-name-as-directory "~rms/lewis") ⇒ "~rms/lewis/"
This function returns a string representing dirname in a form that the operating system will interpret as the name of a file. On most systems, this means removing the final slash (or backslash) from the string.
(directory-file-name "~lewis/") ⇒ "~lewis"
Given a directory name, you can combine it with a relative file name
(concat dirname relfile)
Be sure to verify that the file name is relative before doing that. If you use an absolute file name, the results could be syntactically invalid or refer to the wrong file.
If you want to use a directory file name in making such a
combination, you must first convert it to a directory name using
(concat (file-name-as-directory dirfile) relfile)
Don’t try concatenating a slash by hand, as in
;;; Wrong! (concat dirfile "/" relfile)
because this is not portable. Always use
To convert a directory name to its abbreviation, use this function:
This function returns an abbreviated form of filename. It
applies the abbreviations specified in
(see File Aliases in The GNU Emacs Manual),
then substitutes ‘~’ for the user’s home directory if the
argument names a file in the home directory or one of its
subdirectories. If the home directory is a root directory, it is not
replaced with ‘~’, because this does not make the result shorter
on many systems.
You can use this function for directory names and for file names, because it recognizes abbreviations even as part of the name.