2017-12-19 22 views
0

私は、別のディレクトリに定期的にコピーする必要があるディレクトリを作成するサービスを持っています。ソースは定期的に作成されます。ファイルが一致しない場合、再帰的に1つのディレクトリを別のディレクトリにコピーします。

ディレクトリをコピーするとかなり大きくなります。そのため、コピー先のファイルを追加するか、同じファイルではないファイル(ファイルサイズの不一致や変更日など)を上書きします。

これを行う簡単な方法はありますか?私はFileUtilsを認識していますが、常にすべてのファイルをovewriteするかどうか、またここでは "マージ"とは何かを明確にしています。

+0

は、あなたがこれまで何を試してみましたか? – Verv

+0

ファイルサイズを調べるのではなく、新しいファイルのハッシュを古いファイルのハッシュと照合して確認してください。 –

+0

これは 'rsync'コマンドと同様です。 rsyncのJava実装のためにネットを精査しましたか?おそらくホイールを再発明するよりも良いでしょう。それらのうちのいくつかは、より速いコピーのために圧縮をサポートするかもしれない – Veera

答えて

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; 
      } 
     }); 
} 
関連する問題