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就好了。