copyRecursivelySync method

void copyRecursivelySync(
  1. Directory target, {
  2. bool followLinks = true,
  3. LinkFactory linkFactory = Link.new,
  4. FileFactory fileFactory = File.new,
  5. DirectoryFactory dirFactory = Directory.new,
  6. Context? pathContext,
})

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 within this, throws ArgumentError.
  • If this and target 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);
    }
  }
}