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

Java 如果文件不匹配,则递归地将一个目录复制到另一个目录,java,file-io,apache-commons,Java,File Io,Apache Commons,我有一个服务,它将填充一个我需要定期复制到另一个目录的目录。将定期填充源 当我复制目录时,它将非常大,因此我只想在目标中添加文件,或覆盖不同文件的文件,例如文件大小不匹配或修改日期 有没有一个简单的方法可以做到这一点?我知道,但我不清楚它是否总是写入所有文件,以及合并在这里意味着什么,特别是如果它不会复制已经匹配的文件。和其他文件方法可以做到这一点: public void copyTree(Path source, Path destination)

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

当我复制目录时,它将非常大,因此我只想在目标中添加文件,或覆盖不同文件的文件,例如文件大小不匹配或修改日期

有没有一个简单的方法可以做到这一点?我知道,但我不清楚它是否总是写入所有文件,以及合并在这里意味着什么,特别是如果它不会复制已经匹配的文件。

和其他文件方法可以做到这一点:

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;
            }
        });
}

到目前为止,您是否尝试过任何操作?与其检查文件大小,不如检查新文件的哈希值与旧文件的哈希值。这与“rsync”命令的作用类似。你在网上搜索过rsync的Java实现吗?可能比重新发明轮子要好。其中一些可能支持压缩以更快地复制。@PillHead查看FileUtils源代码,copyFIle只是盲目地覆盖文件。@Veera我不熟悉rsync。我确实看到一些rsync实现可以做到这一点,但是如果有一个不需要rqeuire安装cygwin的soultion就好了。