code: public static boolean copyDirAndFiles(File source, File destination) {
      logger.finest(String.format("WatirUtils::copyDirAndFiles(%s, %s)", source.getAbsolutePath(),
                                  destination.getAbsolutePath()));
  
      if (source.isDirectory()) {
        String[] items;
        items = source.list();
        for (String item : items) {
          File itemSource = new File(source.getPath(), item);
          File itemDestination = new File(destination.getPath(), item);
          boolean res = copyDirAndFiles(itemSource, itemDestination);
          if (!res) {
            logger.severe(String.format("Could not copy \"%s\" to \"%s\"",
                                        itemSource.getPath(), itemDestination.getPath()));
            return false;
          }
        }
      } else {
        try {
          Files.createParentDirs(destination);
          Files.copy(source, destination);
        } catch (IOException e) {
          logger.severe(
              String.format("Could not copy files from \"%s\" to \"%s\"",
                            source.getPath(), destination.getPath()));
          return false;
        }
      }
  
      return true;
    }
docs: Copies the whole disk directory/file structure starting from the source path to the destination
  path.
  
  @param source      the source path, may designate either a file or a directory
  @param destination the destination path