Is there a built-in function to copy a directory in Dart?

No, not to my knowledge there isn't. But Dart supports basic reading and writing of files from directories, so it stands to reason that this could be solved programmatically.

Check out this gist I found of a tool that would accomplish this process.

Basically, you would search the directory for files you wanted to copy and perform the copy operation:

newFile.writeAsBytesSync(element.readAsBytesSync());

to all file paths, new Path(element.path);, in the new Directory(newLocation);.

Edit:

But this is super inefficient, because the whole files has to be read in by the system and wrote back out to a file. You could just use a shell process spawned by Dart to take care of the process for you:

Process.run("cmd", ["/c", "copy", ...])

Thank you James, wrote a quick function for it, but did it an alternative way. I'm unsure if this way would be anymore efficient or not?

/**
 * Retrieve all files within a directory
 */
Future<List<File>> allDirectoryFiles(String directory)
{
  List<File> frameworkFilePaths = [];

  // Grab all paths in directory
  return new Directory(directory).list(recursive: true, followLinks: false)
  .listen((FileSystemEntity entity)
  {
    // For each path, if the path leads to a file, then add to array list
    File file = new File(entity.path);
    file.exists().then((exists)
    {
      if (exists)
      {
        frameworkFilePaths.add(file);
      }
    });

  }).asFuture().then((_) { return frameworkFilePaths; });

}

Edit: OR! An even better approach (in some situations) would be to return a stream of files in the directory:

/**
 * Directory file stream
 *
 * Retrieve all files within a directory as a file stream.
 */
Stream<File> _directoryFileStream(Directory directory)
{
  StreamController<File> controller;
  StreamSubscription source;

  controller = new StreamController<File>(
    onListen: ()
    {
      // Grab all paths in directory
      source = directory.list(recursive: true, followLinks: false).listen((FileSystemEntity entity)
      {
        // For each path, if the path leads to a file, then add the file to the stream
        File file = new File(entity.path);
        file.exists().then((bool exists)
        {
          if (exists)
            controller.add(file);
        });
      },
      onError: () => controller.addError,
      onDone: () => controller.close
      );
    },
    onPause: () { if (source != null) source.pause(); },
    onResume: () { if (source != null) source.resume(); },
    onCancel: () { if (source != null) source.cancel(); }
  );

  return controller.stream;
}