diff --git a/spring-core/src/main/java/org/springframework/util/FileSystemUtils.java b/spring-core/src/main/java/org/springframework/util/FileSystemUtils.java index 7e0e0809aaf..0f5f8d6b16f 100644 --- a/spring-core/src/main/java/org/springframework/util/FileSystemUtils.java +++ b/spring-core/src/main/java/org/springframework/util/FileSystemUtils.java @@ -90,13 +90,12 @@ public abstract class FileSystemUtils { Files.walkFileTree(root, new SimpleFileVisitor<>() { @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + public FileVisitResult visitFile(Path file, BasicFileAttributes attr) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } @@ -131,19 +130,34 @@ public abstract class FileSystemUtils { BasicFileAttributes srcAttr = Files.readAttributes(src, BasicFileAttributes.class); if (srcAttr.isDirectory()) { - Files.walkFileTree(src, EnumSet.of(FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - Files.createDirectories(dest.resolve(src.relativize(dir))); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.copy(file, dest.resolve(src.relativize(file)), StandardCopyOption.REPLACE_EXISTING); - return FileVisitResult.CONTINUE; - } - }); + if (src.getClass() == dest.getClass()) { // dest.resolve(Path) only works for same Path type + Files.walkFileTree(src, EnumSet.of(FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attr) throws IOException { + Files.createDirectories(dest.resolve(src.relativize(dir))); + return FileVisitResult.CONTINUE; + } + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attr) throws IOException { + Files.copy(file, dest.resolve(src.relativize(file)), StandardCopyOption.REPLACE_EXISTING); + return FileVisitResult.CONTINUE; + } + }); + } + else { // use dest.resolve(String) for different Path types + Files.walkFileTree(src, EnumSet.of(FOLLOW_LINKS), Integer.MAX_VALUE, new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attr) throws IOException { + Files.createDirectories(dest.resolve(src.relativize(dir).toString())); + return FileVisitResult.CONTINUE; + } + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attr) throws IOException { + Files.copy(file, dest.resolve(src.relativize(file).toString()), StandardCopyOption.REPLACE_EXISTING); + return FileVisitResult.CONTINUE; + } + }); + } } else if (srcAttr.isRegularFile()) { Files.copy(src, dest); diff --git a/spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java b/spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java index d27f66b70b2..8f8368bbf58 100644 --- a/spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java @@ -17,6 +17,11 @@ package org.springframework.util; import java.io.File; +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -28,6 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Rob Harrop * @author Sam Brannen + * @author Juergen Hoeller */ class FileSystemUtilsTests { @@ -75,8 +81,19 @@ class FileSystemUtilsTests { FileSystemUtils.copyRecursively(src, dest); assertThat(dest).exists(); - assertThat(new File(dest, child.getName())).exists(); + assertThat(new File(dest, "child")).exists(); + assertThat(new File(dest, "child/bar.txt")).exists(); + URI uri = URI.create("jar:file:/" + dest.toString().replace('\\', '/') + "/archive.zip"); + Map env = Map.of("create", "true"); + FileSystem zipfs = FileSystems.newFileSystem(uri, env); + Path ziproot = zipfs.getPath("/"); + FileSystemUtils.copyRecursively(src.toPath(), ziproot); + + assertThat(zipfs.getPath("/child")).exists(); + assertThat(zipfs.getPath("/child/bar.txt")).exists(); + + zipfs.close(); FileSystemUtils.deleteRecursively(src); assertThat(src).doesNotExist(); }