elisp: Unique File Names

 
 24.8.5 Generating Unique File Names
 -----------------------------------
 
 Some programs need to write temporary files.  Here is the usual way to
 construct a name for such a file:
 
      (make-temp-file NAME-OF-APPLICATION)
 
 The job of ‘make-temp-file’ is to prevent two different users or two
 different jobs from trying to use the exact same file name.
 
  -- Function: make-temp-file prefix &optional dir-flag suffix
      This function creates a temporary file and returns its name.  Emacs
      creates the temporary file’s name by adding to PREFIX some random
      characters that are different in each Emacs job.  The result is
      guaranteed to be a newly created empty file.  On MS-DOS, this
      function can truncate the STRING prefix to fit into the 8+3
      file-name limits.  If PREFIX is a relative file name, it is
      expanded against ‘temporary-file-directory’.
 
           (make-temp-file "foo")
                ⇒ "/tmp/foo232J6v"
 
      When ‘make-temp-file’ returns, the file has been created and is
      empty.  At that point, you should write the intended contents into
      the file.
 
      If DIR-FLAG is non-‘nil’, ‘make-temp-file’ creates an empty
      directory instead of an empty file.  It returns the file name, not
      the directory name, of that directory.  SeeDirectory Names.
 
      If SUFFIX is non-‘nil’, ‘make-temp-file’ adds it at the end of the
      file name.
 
      To prevent conflicts among different libraries running in the same
      Emacs, each Lisp program that uses ‘make-temp-file’ should have its
      own PREFIX.  The number added to the end of PREFIX distinguishes
      between the same application running in different Emacs jobs.
      Additional added characters permit a large number of distinct names
      even in one Emacs job.
 
    The default directory for temporary files is controlled by the
 variable ‘temporary-file-directory’.  This variable gives the user a
 uniform way to specify the directory for all temporary files.  Some
 programs use ‘small-temporary-file-directory’ instead, if that is
 non-‘nil’.  To use it, you should expand the prefix against the proper
 directory before calling ‘make-temp-file’.
 
  -- User Option: temporary-file-directory
      This variable specifies the directory name for creating temporary
      files.  Its value should be a directory name (SeeDirectory
      Names), but it is good for Lisp programs to cope if the value is
      a directory’s file name instead.  Using the value as the second
      argument to ‘expand-file-name’ is a good way to achieve that.
 
      The default value is determined in a reasonable way for your
      operating system; it is based on the ‘TMPDIR’, ‘TMP’ and ‘TEMP’
      environment variables, with a fall-back to a system-dependent name
      if none of these variables is defined.
 
      Even if you do not use ‘make-temp-file’ to create the temporary
      file, you should still use this variable to decide which directory
      to put the file in.  However, if you expect the file to be small,
      you should use ‘small-temporary-file-directory’ first if that is
      non-‘nil’.
 
  -- User Option: small-temporary-file-directory
      This variable specifies the directory name for creating certain
      temporary files, which are likely to be small.
 
      If you want to write a temporary file which is likely to be small,
      you should compute the directory like this:
 
           (make-temp-file
             (expand-file-name PREFIX
                               (or small-temporary-file-directory
                                   temporary-file-directory)))
 
  -- Function: make-temp-name base-name
      This function generates a string that can be used as a unique file
      name.  The name starts with BASE-NAME, and has several random
      characters appended to it, which are different in each Emacs job.
      It is like ‘make-temp-file’ except that (i) it just constructs a
      name, and does not create a file, and (ii) BASE-NAME should be an
      absolute file name (on MS-DOS, this function can truncate BASE-NAME
      to fit into the 8+3 file-name limits).
 
      *Warning:* In most cases, you should not use this function; use
      ‘make-temp-file’ instead!  This function is susceptible to a race
      condition, between the ‘make-temp-name’ call and the creation of
      the file, which in some cases may cause a security hole.