FileUtils:跳过目标中已有的文件并复制其余文件
FileUtils: Skips files that are already in destination and copy rest of the files
我正在使用以下方法在使用 java 的两个目录之间传输文件。
FileUtils.copyDirectory(sourceDir, destinationDir,fileFilter,false);
但是如果在目标目录中也找到同名文件,源文件将覆盖它。我想要的是排除目标中也存在的那些文件并复制其余文件,最终防止覆盖..
一种方法是自己写:
try (Stream<Path> files = Files.walk(sourceDir.toPath())
.filter(f -> fileFilter.accept(f.toFile()))) {
files.forEach(src -> {
Path dest = destinationDir.toPath().resolve(
sourceDir.toPath().relativize(src));
if (!Files.exists(dest)) {
try {
if (Files.isDirectory(src)) {
Files.createDirectories(dest);
} else {
Files.copy(src, dest,
StandardCopyOption.COPY_ATTRIBUTES);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
})
}
或者,您可以只修改过滤器:
FileFilter oldFilter = fileFilter;
fileFilter = f -> oldFilter.accept(f) &&
!Files.exists(destinationDir.toPath().resolve(
sourceDir.toPath().relativize(f.toPath())));
我正在使用以下方法在使用 java 的两个目录之间传输文件。
FileUtils.copyDirectory(sourceDir, destinationDir,fileFilter,false);
但是如果在目标目录中也找到同名文件,源文件将覆盖它。我想要的是排除目标中也存在的那些文件并复制其余文件,最终防止覆盖..
一种方法是自己写:
try (Stream<Path> files = Files.walk(sourceDir.toPath())
.filter(f -> fileFilter.accept(f.toFile()))) {
files.forEach(src -> {
Path dest = destinationDir.toPath().resolve(
sourceDir.toPath().relativize(src));
if (!Files.exists(dest)) {
try {
if (Files.isDirectory(src)) {
Files.createDirectories(dest);
} else {
Files.copy(src, dest,
StandardCopyOption.COPY_ATTRIBUTES);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
})
}
或者,您可以只修改过滤器:
FileFilter oldFilter = fileFilter;
fileFilter = f -> oldFilter.accept(f) &&
!Files.exists(destinationDir.toPath().resolve(
sourceDir.toPath().relativize(f.toPath())));