% File src/library/base/man/files.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2023 R Core Team
% Distributed under GPL 2 or later

\name{files2}
\alias{dir.create}
\alias{dir.exists}
\alias{Sys.chmod}
\alias{Sys.umask}
\concept{directory}
\concept{\I{mkdir}}
\alias{umask} % for links
\title{Manipulation of Directories and File Permissions}
\description{
  These functions provide a low-level interface to the computer's
  file system.
}
\usage{
dir.exists(paths)
dir.create(path, showWarnings = TRUE, recursive = FALSE, mode = "0777")
Sys.chmod(paths, mode = "0777", use_umask = TRUE)
Sys.umask(mode = NA)
}
\arguments{
  \item{path}{a character vector containing a single path name.  Tilde
    expansion (see \code{\link{path.expand}}) is done.}
  \item{paths}{character vectors containing file or directory paths.  Tilde
    expansion (see \code{\link{path.expand}}) is done.}
  \item{showWarnings}{logical; should the warnings on failure be shown?}
  \item{recursive}{logical. Should elements of the path other than the
    last be created?  If true, like the Unix command \command{mkdir -p}.}
  \item{mode}{the mode to be used on Unix-alikes: it will be
    coerced by \code{\link{as.octmode}}.  For \code{Sys.chmod} it is
    recycled along \code{paths}.}
  \item{use_umask}{logical: should the mode be restricted by the
    \code{umask} setting?}
}
\details{
  \code{dir.exists} checks that the paths exist (in the same sense as
  \code{\link{file.exists}}) and are directories.

  \code{dir.create} creates the last element of the path, unless
  \code{recursive = TRUE}.  Trailing path separators are discarded.
#ifdef windows
  On Windows drives are allowed in the path specification and unless
  the path is rooted, it will be interpreted relative to the current
  directory on that drive.  \code{mode} is ignored on Windows.
#endif
#ifdef unix
  The mode will be modified by the \code{umask} setting in the same way
  as for the system function \code{mkdir}.  What modes can be set is
  OS-dependent, and it is unsafe to assume that more than three octal
  digits will be used.  For more details see your OS's documentation on the
  system call \code{mkdir}, e.g.\sspace{}\command{man 2 mkdir} (and not that on
  the command-line utility of that name).
#endif

  One of the idiosyncrasies of Windows is that directory creation may
  report success but create a directory with a different name, for
  example \code{dir.create("G.S.")} creates \file{"G.S"}.  This is
  undocumented, and what are the precise circumstances is unknown (and
  might depend on the version of Windows).  Also avoid directory names
  with a trailing space.
  %% http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx
  %% is vague about this!

  \code{Sys.chmod} sets the file permissions of one or more files.
#ifdef unix
  It may not be supported on a system (when a warning is issued).
  See the comments for \code{dir.create} for how modes are interpreted.
  Changing mode on a symbolic link is unlikely to work (nor be
  necessary).  For more details see your OS's documentation on the
  system call \code{chmod}, e.g.\sspace{}\command{man 2 chmod} (and not that on
  the command-line utility of that name).  Whether this changes the
  permission of a symbolic link or its target is OS-dependent (although
  to change the target is more common, and POSIX does not support modes
  for symbolic links: BSD-based Unixes do, though).
#endif
#ifdef windows
  The interpretation of \code{mode} in the Windows system functions is
  non-POSIX and only supports setting the read-only attribute of the
  file.  So \R interprets \code{mode} to mean set read-only if and only
  if \code{(mode & 0200) == 0} (interpreted in octal).  Windows has a much
  more extensive system of file permissions on some file systems
  (e.g., versions of \abbr{NTFS}) which are unrelated to this system call.
#endif

  \code{Sys.umask} sets the \code{umask} and returns the previous value:
  as a special case \code{mode = NA} just returns the current value.
#ifdef unix
  It may not be supported (when a warning is issued and \code{"0"}
  is returned).  For more details see your OS's documentation on the
  system call \code{umask}, e.g.\sspace{}\command{man 2 umask}.
#endif
#ifdef windows
  All files on Windows are regarded as readable, and files being
  executable is not a Windows concept.  So \code{umask} only controls
  whether a file is writable: a setting of \code{"200"} makes files (but
  not directories) created subsequently read-only.
#endif
%% http://msdn.microsoft.com/en-us/library/5axxx3be%28v=vs.80%29.aspx

  How modes are handled depends on the file system, even on Unix-alikes
  (although their documentation is often written assuming a POSIX file
  system).  So treat documentation cautiously if you are using, say, a
  FAT/FAT32 or network-mounted file system.

  See \link{files} for how file paths with marked encodings are interpreted.
}
\value{
  \code{dir.exists} returns a logical vector of \code{TRUE} or
  \code{FALSE} values (without names).

  \code{dir.create} and \code{Sys.chmod} return invisibly a logical vector
  indicating if the operation succeeded for each of the files attempted.
  Using a missing value for a path name will always be regarded as a
  failure.  \code{dir.create} indicates failure if the directory already
  exists.  If \code{showWarnings = TRUE}, \code{dir.create} will give a
  warning for an unexpected failure (e.g., not for a missing value nor
  for an already existing component for \code{recursive = TRUE}).

  \code{Sys.umask} returns the previous value of the \code{umask},
  as a length-one object of class \code{"\link{octmode}"}: the
  visibility flag is off unless \code{mode} is \code{NA}.

  See also the section in the help for \code{\link{file.exists}} on
  case-insensitive file systems for the interpretation of \code{path}
  and \code{paths}.
}
#ifdef windows
\note{
  There is no guarantee that these functions will handle Windows
  relative paths of the form \file{d:path}: try \file{d:./path}
  instead.  In particular, \file{d:} is not recognized as a directory.
  Nor are \samp{\\\\?\\} prefixes (and similar) supported.

  UTF-8-encoded \I{dirname}s not valid in the current locale can be used.
}
#endif

\author{
  Ross Ihaka, Brian Ripley
}
\seealso{
  \code{\link{file.info}}, \code{\link{file.exists}}, \code{\link{file.path}},
  \code{\link{list.files}}, \code{\link{unlink}},
  \code{\link{basename}}, \code{\link{path.expand}}.
}

\examples{\dontrun{
## Fix up maximal allowed permissions in a file tree
Sys.chmod(list.dirs("."), "777")
f <- list.files(".", all.files = TRUE, full.names = TRUE, recursive = TRUE)
Sys.chmod(f, (file.mode(f) | "664"))
}}
\keyword{file}
