Skip to content

Commit a053e65

Browse files
committed
Merge branch '6.2.x'
# Conflicts: # spring-core/src/main/java/org/springframework/core/io/Resource.java # spring-core/src/main/java/org/springframework/core/io/buffer/DataBufferUtils.java # spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java # spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java
2 parents b8f71b2 + ba52164 commit a053e65

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

spring-core/src/main/java/org/springframework/util/FileSystemUtils.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

spring-core/src/test/java/org/springframework/util/FileSystemUtilsTests.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
package org.springframework.util;
1818

1919
import java.io.File;
20+
import java.net.URI;
21+
import java.nio.file.FileSystem;
22+
import java.nio.file.FileSystems;
23+
import java.nio.file.Path;
24+
import java.util.Map;
2025

2126
import org.junit.jupiter.api.Test;
2227
import org.junit.jupiter.api.io.TempDir;
@@ -28,6 +33,7 @@
2833
*
2934
* @author Rob Harrop
3035
* @author Sam Brannen
36+
* @author Juergen Hoeller
3137
*/
3238
class FileSystemUtilsTests {
3339

@@ -75,8 +81,19 @@ void copyRecursively(@TempDir File tempDir) throws Exception {
7581
FileSystemUtils.copyRecursively(src, dest);
7682

7783
assertThat(dest).exists();
78-
assertThat(new File(dest, child.getName())).exists();
84+
assertThat(new File(dest, "child")).exists();
85+
assertThat(new File(dest, "child/bar.txt")).exists();
7986

87+
URI uri = URI.create("jar:file:/" + dest.toString().replace('\\', '/') + "/archive.zip");
88+
Map<String, String> env = Map.of("create", "true");
89+
FileSystem zipfs = FileSystems.newFileSystem(uri, env);
90+
Path ziproot = zipfs.getPath("/");
91+
FileSystemUtils.copyRecursively(src.toPath(), ziproot);
92+
93+
assertThat(zipfs.getPath("/child")).exists();
94+
assertThat(zipfs.getPath("/child/bar.txt")).exists();
95+
96+
zipfs.close();
8097
FileSystemUtils.deleteRecursively(src);
8198
assertThat(src).doesNotExist();
8299
}

0 commit comments

Comments
 (0)