@@ -90,13 +90,12 @@ public static boolean deleteRecursively(@Nullable Path root) throws IOException
9090
9191 Files .walkFileTree (root , new SimpleFileVisitor <>() {
9292 @ Override
93- public FileVisitResult visitFile (Path file , BasicFileAttributes attrs ) throws IOException {
93+ public FileVisitResult visitFile (Path file , BasicFileAttributes attr ) throws IOException {
9494 Files .delete (file );
9595 return FileVisitResult .CONTINUE ;
9696 }
97-
9897 @ Override
99- public FileVisitResult postVisitDirectory (Path dir , IOException exc ) throws IOException {
98+ public FileVisitResult postVisitDirectory (Path dir , IOException ex ) throws IOException {
10099 Files .delete (dir );
101100 return FileVisitResult .CONTINUE ;
102101 }
@@ -131,19 +130,34 @@ public static void copyRecursively(Path src, Path dest) throws IOException {
131130 BasicFileAttributes srcAttr = Files .readAttributes (src , BasicFileAttributes .class );
132131
133132 if (srcAttr .isDirectory ()) {
134- Files .walkFileTree (src , EnumSet .of (FOLLOW_LINKS ), Integer .MAX_VALUE , new SimpleFileVisitor <>() {
135- @ Override
136- public FileVisitResult preVisitDirectory (Path dir , BasicFileAttributes attrs ) throws IOException {
137- Files .createDirectories (dest .resolve (src .relativize (dir )));
138- return FileVisitResult .CONTINUE ;
139- }
140-
141- @ Override
142- public FileVisitResult visitFile (Path file , BasicFileAttributes attrs ) throws IOException {
143- Files .copy (file , dest .resolve (src .relativize (file )), StandardCopyOption .REPLACE_EXISTING );
144- return FileVisitResult .CONTINUE ;
145- }
146- });
133+ if (src .getClass () == dest .getClass ()) { // dest.resolve(Path) only works for same Path type
134+ Files .walkFileTree (src , EnumSet .of (FOLLOW_LINKS ), Integer .MAX_VALUE , new SimpleFileVisitor <>() {
135+ @ Override
136+ public FileVisitResult preVisitDirectory (Path dir , BasicFileAttributes attr ) throws IOException {
137+ Files .createDirectories (dest .resolve (src .relativize (dir )));
138+ return FileVisitResult .CONTINUE ;
139+ }
140+ @ Override
141+ public FileVisitResult visitFile (Path file , BasicFileAttributes attr ) throws IOException {
142+ Files .copy (file , dest .resolve (src .relativize (file )), StandardCopyOption .REPLACE_EXISTING );
143+ return FileVisitResult .CONTINUE ;
144+ }
145+ });
146+ }
147+ else { // use dest.resolve(String) for different Path types
148+ Files .walkFileTree (src , EnumSet .of (FOLLOW_LINKS ), Integer .MAX_VALUE , new SimpleFileVisitor <>() {
149+ @ Override
150+ public FileVisitResult preVisitDirectory (Path dir , BasicFileAttributes attr ) throws IOException {
151+ Files .createDirectories (dest .resolve (src .relativize (dir ).toString ()));
152+ return FileVisitResult .CONTINUE ;
153+ }
154+ @ Override
155+ public FileVisitResult visitFile (Path file , BasicFileAttributes attr ) throws IOException {
156+ Files .copy (file , dest .resolve (src .relativize (file ).toString ()), StandardCopyOption .REPLACE_EXISTING );
157+ return FileVisitResult .CONTINUE ;
158+ }
159+ });
160+ }
147161 }
148162 else if (srcAttr .isRegularFile ()) {
149163 Files .copy (src , dest );
0 commit comments