如果文件不匹配,则递归地将一个目录复制到另一个目录

时间:2017-12-19 15:58:05

标签: java file-io apache-commons

我有一个服务,它将填充我需要定期复制到另一个目录的目录。源将定期填充。

当我复制目录时,它会非常大,所以我只想在目标中添加文件,或者覆盖不属于同一文件的文件(例如文件大小不匹配或修改日期)。

有一种简单的方法吗?我知道FileUtils,但我不清楚它是否会始终覆盖所有文件,以及"合并"这意味着,特别是如果它不会复制已经匹配的文件。

1 个答案:

答案 0 :(得分:1)

Files.walkFileTree和文件的其他方法可以做到:

public void copyTree(Path source,
                     Path destination)
throws IOException {

    Files.walkFileTree(source,
        new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                                                     BasicFileAttributes attr)
            throws IOException {
                Path destPath = destination.resolve(source.relativize(dir));
                Files.createDirectories(destPath);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attr)
            throws IOException {

                Path destPath = destination.resolve(source.relativize(file));

                FileTime sourceTime = Files.getLastModifiedTime(file);
                FileTime destinationTime = Files.getLastModifiedTime(destPath);
                if (!Files.exists(destPath) ||
                    sourceTime.compareTo(destinationTime) > 0) {

                    Files.copy(file, destPath,
                        StandardCopyOption.COPY_ATTRIBUTES,
                        StandardCopyOption.REPLACE_EXISTING);
                }

                return FileVisitResult.CONTINUE;
            }
        });
}