blob: 9209e975658a93bfb914203fe0b824312c34fbdd [file] [log] [blame]
% File src/library/utils/man/changedFiles.Rd
% Part of the R package, https://www.R-project.org
% Copyright 2013 R Core Team
% Distributed under GPL 2 or later
\name{changedFiles}
\alias{fileSnapshot}
\alias{changedFiles}
\alias{print.changedFiles}
\alias{print.fileSnapshot}
\title{Detect which Files Have Changed}
\description{
\code{fileSnapshot} takes a snapshot of a selection of files,
recording summary information about each. \code{changedFiles}
compares two snapshots, or compares one snapshot to the current state
of the file system. The snapshots need not be the same directory;
this could be used to compare two directories.
}
\usage{
fileSnapshot(path = ".", file.info = TRUE, timestamp = NULL,
md5sum = FALSE, digest = NULL, full.names = length(path) > 1,
...)
changedFiles(before, after, path = before$path, timestamp = before$timestamp,
check.file.info = c("size", "isdir", "mode", "mtime"),
md5sum = before$md5sum, digest = before$digest,
full.names = before$full.names, ...)
\S3method{print}{fileSnapshot}(x, verbose = FALSE, ...)
\S3method{print}{changedFiles}(x, verbose = FALSE, ...)
}
\arguments{
\item{path}{character vector; the path(s) to record. }
\item{file.info}{logical; whether to record \code{\link{file.info}}
values for each file.
}
\item{timestamp}{character string or \code{NULL}; the name of a file
to write at the time the snapshot is taken. This gives a quick test
for modification, but may be unreliable; see the Details. }
\item{md5sum}{logical; whether MD5 summaries of each file should be
taken as part of the snapshot. }
\item{digest}{a function or \code{NULL}; a function with header
\code{function(filename)} which will take a vector of filenames and
produce a vector of values of the same length, or a matrix with that
number of rows. }
\item{full.names}{logical; whether full names (as in
\code{\link{list.files}}) should be recorded. Must be \code{TRUE} if
\code{length(path) > 1}. }
\item{\dots}{ additional parameters to pass to
\code{\link{list.files}} to control the set of files in the snapshots.
}
\item{before, after}{objects produced by \code{fileSnapshot}; two
snapshots to compare. If \code{after} is missing, a new snapshot of
the current file system will be produced for comparison, using
arguments recorded in \code{before} as defaults. }
\item{check.file.info}{character vector; which columns from
\code{\link{file.info}} should be compared. }
\item{x}{the object to print. }
\item{verbose}{logical; whether to list all data when printing. }
}
\details{
The \code{fileSnapshot} function uses \code{\link{list.files}} to
obtain a list of files, and depending on the \code{file.info},
\code{md5sum}, and \code{digest} arguments, records information about
each file.
The \code{changedFiles} function compares two snapshots.
If the \code{timestamp} argument to \code{fileSnapshot} is length 1, a
file with that name is created. If it is length 1 in
\code{changedFiles}, the \code{\link{file_test}} function is used to
compare the age of all files common to both \code{before} and
\code{after} to it. This test may be unreliable: it compares the
current modification time of the \code{after} files to the timestamp;
that may not be the same as the modification time when the
\code{after} snapshot was taken. It may also give incorrect results
if the clock on the file system holding the timestamp differs from the
one holding the snapshot files.
If the \code{check.file.info} argument contains a non-empty character
vector, the indicated columns from the result of a call to
\code{\link{file.info}} will be compared.
If \code{md5sum} is \code{TRUE}, \code{fileSnapshot} will call the
\code{tools::\link{md5sum}} function to record the 32 byte MD5
checksum for each file, and \code{changedFiles} will compare the
values. The \code{digest} argument allows users to provide their own
digest function.
}
\value{
\code{fileSnapshot} returns an object of class \code{"fileSnapshot"}.
This is a list containing the fields
\item{info}{a data frame whose rownames are the filenames, and whose
columns contain the requested snapshot data}
\item{path}{the normalized \code{path} from the call}
\item{timestamp, file.info, md5sum, digest, full.names}{a record of
the other arguments from the call}
\item{args}{other arguments passed via \code{...} to
\code{\link{list.files}}.}
\code{changedFiles} produces an object of class \code{"changedFiles"}.
This is a list containing
\item{added, deleted, changed, unchanged}{character vectors of
filenames from the before and after snapshots, with obvious meanings}
\item{changes}{a logical matrix with a row for each common file, and a
column for each comparison test. \code{TRUE} indicates a change in
that test.}
\code{\link{print}} methods are defined for each of these types. The
\code{\link{print}} method for \code{"fileSnapshot"} objects
displays the arguments used to produce them, while the one for
\code{"changedFiles"} displays the \code{added}, \code{deleted} and
\code{changed} fields if non-empty, and a submatrix of the
\code{changes} matrix containing all of the \code{TRUE} values.
}
\author{
Duncan Murdoch, using suggestions from Karl Millar and others.
}
\seealso{
\code{\link{file.info}}, \code{\link{file_test}}, \code{\link{md5sum}}.
}
\examples{
# Create some files in a temporary directory
dir <- tempfile()
dir.create(dir)
writeBin(1L, file.path(dir, "file1"))
writeBin(2L, file.path(dir, "file2"))
dir.create(file.path(dir, "dir"))
# Take a snapshot
snapshot <- fileSnapshot(dir, timestamp = tempfile("timestamp"), md5sum=TRUE)
# Change one of the files.
writeBin(3L:4L, file.path(dir, "file2"))
# Display the detected changes. We may or may not see mtime change...
changedFiles(snapshot)
changedFiles(snapshot)$changes
}
\keyword{utilities}
\keyword{file}