\section{\module{shutil} ---
         High-level file operations}

\declaremodule{standard}{shutil}
\modulesynopsis{High-level file operations, including copying.}
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}
% partly based on the docstrings


The \module{shutil} module offers a number of high-level operations on
files and collections of files.  In particular, functions are provided 
which support file copying and removal.
\index{file!copying}
\index{copying files}

\strong{Caveat:}  On MacOS, the resource fork and other metadata are
not used.  For file copies, this means that resources will be lost and 
file type and creator codes will not be correct.


\begin{funcdesc}{copyfile}{src, dst}
  Copy the contents of the file named \var{src} to a file named
  \var{dst}.  The destination location must be writable; otherwise, 
  an \exception{IOError} exception will be raised.
  If \var{dst} already exists, it will be replaced.  
  Special files such as character or block devices
  and pipes cannot be copied with this function.  \var{src} and
  \var{dst} are path names given as strings.
\end{funcdesc}

\begin{funcdesc}{copyfileobj}{fsrc, fdst\optional{, length}}
  Copy the contents of the file-like object \var{fsrc} to the
  file-like object \var{fdst}.  The integer \var{length}, if given,
  is the buffer size. In particular, a negative \var{length} value
  means to copy the data without looping over the source data in
  chunks; by default the data is read in chunks to avoid uncontrolled
  memory consumption.
\end{funcdesc}

\begin{funcdesc}{copymode}{src, dst}
  Copy the permission bits from \var{src} to \var{dst}.  The file
  contents, owner, and group are unaffected.  \var{src} and \var{dst}
  are path names given as strings.
\end{funcdesc}

\begin{funcdesc}{copystat}{src, dst}
  Copy the permission bits, last access time, and last modification
  time from \var{src} to \var{dst}.  The file contents, owner, and
  group are unaffected.  \var{src} and \var{dst} are path names given
  as strings.
\end{funcdesc}

\begin{funcdesc}{copy}{src, dst}
  Copy the file \var{src} to the file or directory \var{dst}.  If
  \var{dst} is a directory, a file with the same basename as \var{src} 
  is created (or overwritten) in the directory specified.  Permission
  bits are copied.  \var{src} and \var{dst} are path names given as
  strings.
\end{funcdesc}

\begin{funcdesc}{copy2}{src, dst}
  Similar to \function{copy()}, but last access time and last
  modification time are copied as well.  This is similar to the
  \UNIX{} command \program{cp} \programopt{-p}.
\end{funcdesc}

\begin{funcdesc}{copytree}{src, dst\optional{, symlinks}}
  Recursively copy an entire directory tree rooted at \var{src}.  The
  destination directory, named by \var{dst}, must not already exist;
  it will be created as well as missing parent directories.
  Permissions and times of directories are copied with \function{copystat()},
  individual files are copied using \function{copy2()}.  
  If \var{symlinks} is true, symbolic links in
  the source tree are represented as symbolic links in the new tree;
  if false or omitted, the contents of the linked files are copied to
  the new tree.  If exception(s) occur, an Error is raised
  with a list of reasons.

  The source code for this should be considered an example rather than 
  a tool.

  \versionchanged[Error is raised if any exceptions occur during copying,
  rather than printing a message]{2.3}

  \versionchanged[Create intermediate directories needed to create \var{dst},
  rather than raising an error. Copy permissions and times of directories using
  \function{copystat()}]{2.5}

\end{funcdesc}

\begin{funcdesc}{rmtree}{path\optional{, ignore_errors\optional{, onerror}}}
  Delete an entire directory tree.\index{directory!deleting}
  If \var{ignore_errors} is true,
  errors resulting from failed removals will be ignored; if false or
  omitted, such errors are handled by calling a handler specified by
  \var{onerror} or, if that is omitted, they raise an exception.

  If \var{onerror} is provided, it must be a callable that accepts
  three parameters: \var{function}, \var{path}, and \var{excinfo}.
  The first parameter, \var{function}, is the function which raised
  the exception; it will be \function{os.listdir()}, \function{os.remove()} or
  \function{os.rmdir()}.  The second parameter, \var{path}, will be
  the path name passed to \var{function}.  The third parameter,
  \var{excinfo}, will be the exception information return by
  \function{sys.exc_info()}.  Exceptions raised by \var{onerror} will
  not be caught.
\end{funcdesc}

\begin{funcdesc}{move}{src, dst}
Recursively move a file or directory to another location.

If the destination is on our current filesystem, then simply use
rename.  Otherwise, copy src to the dst and then remove src.

\versionadded{2.3}
\end{funcdesc}

\begin{excdesc}{Error}
This exception collects exceptions that raised during a mult-file
operation. For \function{copytree}, the exception argument is a
list of 3-tuples (\var{srcname}, \var{dstname}, \var{exception}).

\versionadded{2.3}
\end{excdesc}

\subsection{Example \label{shutil-example}}

This example is the implementation of the \function{copytree()}
function, described above, with the docstring omitted.  It
demonstrates many of the other functions provided by this module.

\begin{verbatim}
def copytree(src, dst, symlinks=0):
    names = os.listdir(src)
    os.mkdir(dst)
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks)
            else:
                copy2(srcname, dstname)
        except (IOError, os.error), why:
            print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why))
\end{verbatim}
