copyRecursivelySync method
void
copyRecursivelySync(})
Copies all of the files in this directory to target
.
This is similar to cp -R <from> <to>
:
- Symlinks are supported.
- Existing files are over-written, if any.
- If
target
is withinthis
, throws ArgumentError. - If
this
andtarget
are canonically the same, no operation occurs.
For the async version see copyRecursively
Implementation
void copyRecursivelySync(
Directory target, {
bool followLinks = true,
LinkFactory linkFactory = Link.new,
FileFactory fileFactory = File.new,
DirectoryFactory dirFactory = Directory.new,
lib_path.Context? pathContext,
}) {
pathContext ??= lib_path.context;
if (pathContext.canonicalize(path) ==
pathContext.canonicalize(target.path)) {
return;
}
if (pathContext.isWithin(path, target.path)) {
throw ArgumentError("Cannot copy $path to ${target.path}");
}
target.createSync(recursive: true);
for (final file in listSync(recursive: true, followLinks: followLinks)) {
final copyTo = pathContext.join(
target.path,
pathContext.relative(file.path, from: path),
);
if (file is Directory) {
dirFactory(copyTo).createSync(recursive: true);
} else if (file is File) {
fileFactory(file.path).copySync(copyTo);
} else if (file is Link) {
final linkTarget = file.targetSync();
linkFactory(copyTo).createSync(linkTarget, recursive: true);
}
}
}