elisp: File Name Components

 
 24.8.1 File Name Components
 ---------------------------
 
 The operating system groups files into directories.  To specify a file,
 you must specify the directory and the file’s name within that
 directory.  Therefore, Emacs considers a file name as having two main
 parts: the “directory name” part, and the “nondirectory” part (or “file
 name within the directory”).  Either part may be empty.  Concatenating
 these two parts reproduces the original file name.
 
    On most systems, the directory part is everything up to and including
 the last slash (backslash is also allowed in input on MS-DOS or
 MS-Windows); the nondirectory part is the rest.
 
    For some purposes, the nondirectory part is further subdivided into
 the name proper and the “version number”.  On most systems, only backup
 files have version numbers in their names.
 
  -- Function: file-name-directory filename
      This function returns the directory part of FILENAME, as a
      directory name (SeeDirectory Names), or ‘nil’ if FILENAME does
      not include a directory part.
 
      On GNU and Unix systems, a string returned by this function always
      ends in a slash.  On MS-DOS it can also end in a colon.
 
           (file-name-directory "lewis/foo")  ; Unix example
                ⇒ "lewis/"
           (file-name-directory "foo")        ; Unix example
                ⇒ nil
 
  -- Function: file-name-nondirectory filename
      This function returns the nondirectory part of FILENAME.
 
           (file-name-nondirectory "lewis/foo")
                ⇒ "foo"
           (file-name-nondirectory "foo")
                ⇒ "foo"
           (file-name-nondirectory "lewis/")
                ⇒ ""
 
  -- Function: file-name-sans-versions filename &optional
           keep-backup-version
      This function returns FILENAME with any file version numbers,
      backup version numbers, or trailing tildes discarded.
 
      If KEEP-BACKUP-VERSION is non-‘nil’, then true file version numbers
      understood as such by the file system are discarded from the return
      value, but backup version numbers are kept.
 
           (file-name-sans-versions "~rms/foo.~1~")
                ⇒ "~rms/foo"
           (file-name-sans-versions "~rms/foo~")
                ⇒ "~rms/foo"
           (file-name-sans-versions "~rms/foo")
                ⇒ "~rms/foo"
 
  -- Function: file-name-extension filename &optional period
      This function returns FILENAME’s final extension, if any, after
      applying ‘file-name-sans-versions’ to remove any version/backup
      part.  The extension, in a file name, is the part that follows the
      last ‘.’ in the last name component (minus any version/backup
      part).
 
      This function returns ‘nil’ for extensionless file names such as
      ‘foo’.  It returns ‘""’ for null extensions, as in ‘foo.’.  If the
      last component of a file name begins with a ‘.’, that ‘.’ doesn’t
      count as the beginning of an extension.  Thus, ‘.emacs’’s extension
      is ‘nil’, not ‘.emacs’.
 
      If PERIOD is non-‘nil’, then the returned value includes the period
      that delimits the extension, and if FILENAME has no extension, the
      value is ‘""’.
 
  -- Function: file-name-sans-extension filename
      This function returns FILENAME minus its extension, if any.  The
      version/backup part, if present, is only removed if the file has an
      extension.  For example,
 
           (file-name-sans-extension "foo.lose.c")
                ⇒ "foo.lose"
           (file-name-sans-extension "big.hack/foo")
                ⇒ "big.hack/foo"
           (file-name-sans-extension "/my/home/.emacs")
                ⇒ "/my/home/.emacs"
           (file-name-sans-extension "/my/home/.emacs.el")
                ⇒ "/my/home/.emacs"
           (file-name-sans-extension "~/foo.el.~3~")
                ⇒ "~/foo"
           (file-name-sans-extension "~/foo.~3~")
                ⇒ "~/foo.~3~"
 
      Note that the ‘.~3~’ in the two last examples is the backup part,
      not an extension.
 
  -- Function: file-name-base &optional filename
      This function is the composition of ‘file-name-sans-extension’ and
      ‘file-name-nondirectory’.  For example,
 
           (file-name-base "/my/home/foo.c")
               ⇒ "foo"
 
      The FILENAME argument defaults to ‘buffer-file-name’.