importjava.nio.file.FileSystemLoopException;importjava.nio.file.attribute.FileTime;importjava.io.IOException;importjava.nio.file.FileVisitOption;importjava.nio.file.FileVisitResult;importjava.nio.file.FileVisitor;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.nio.file.attribute.BasicFileAttributes;importjava.util.EnumSet;import staticjava.nio.file.StandardCopyOption.REPLACE_EXISTING;import staticjava.nio.file.StandardCopyOption.COPY_ATTRIBUTES;class CopyTree implementsFileVisitor {private finalPath copyFrom;private finalPath copyTo;publicCopyTree(Path copyFrom, Path copyTo) {this.copyFrom =copyFrom;this.copyTo =copyTo;
}static void copySubTree(Path copyFrom, Path copyTo) throwsIOException {try{
Files.copy(copyFrom, copyTo, REPLACE_EXISTING, COPY_ATTRIBUTES);
}catch(IOException e) {
System.err.println("Unable to copy " + copyFrom + " [" + e + "]");
}
}
@OverridepublicFileVisitResult postVisitDirectory(Object dir, IOException exc)throwsIOException {if (exc == null) {
Path newdir=copyTo.resolve(copyFrom.relativize((Path) dir));try{
FileTime time=Files.getLastModifiedTime((Path) dir);
Files.setLastModifiedTime(newdir, time);
}catch(IOException e) {
System.err.println("Unable to copy all attributes to: " + newdir+" ["+e+ "]");
}
}else{throwexc;
}returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)throwsIOException {
System.out.println("Copy directory: " +(Path) dir);
Path newdir=copyTo.resolve(copyFrom.relativize((Path) dir));try{
Files.copy((Path) dir, newdir, REPLACE_EXISTING, COPY_ATTRIBUTES);
}catch(IOException e) {
System.err.println("Unable to create " + newdir + " [" + e + "]");returnFileVisitResult.SKIP_SUBTREE;
}returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult visitFile(Object file, BasicFileAttributes attrs)throwsIOException {
System.out.println("Copy file: " +(Path) file);
copySubTree((Path) file, copyTo.resolve(copyFrom.relativize((Path) file)));returnFileVisitResult.CONTINUE;
}
@OverridepublicFileVisitResult visitFileFailed(Object file, IOException exc)throwsIOException {if (exc instanceofFileSystemLoopException) {
System.err.println("Cycle was detected: " +(Path) file);
}else{
System.err.println("Error occurred, unable to copy:" +(Path) file+" ["+ exc + "]");
}returnFileVisitResult.CONTINUE;
}
}classMain {public static void main(String[] args) throwsIOException {
Path copyFrom= Paths.get("C:/rafaelnadal");
Path copyTo= Paths.get("C:/rafaelnadal_copy");
CopyTree walk= newCopyTree(copyFrom, copyTo);
EnumSet opts=EnumSet.of(FileVisitOption.FOLLOW_LINKS);
Files.walkFileTree(copyFrom, opts, Integer.MAX_VALUE, walk);
}
}