resolve(path) と relativize(path) の使用を完全に理解しています。次のスニペットには、私にはあまり明確ではないものがあります。
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attr) throws IOException
{
destinationFolder = destinationFolder.resolve(source.relativize(dir));
Files.copy(dir, destinationFolder,StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
このスニペットはここから取得されました(preVisitDirectory メソッド)。の名前を に変更したので、少し修正しましtargetたdestinationFolder。
destinationFolder が/home/user/Desktop/Destinationで、source と dir (少なくとも最初の再帰呼び出しの場合) が/home/user/Desktop/ToBeCopied.
destinationFolder の結果は になります/home/user/Desktop/Destination。これは正常に機能し、非常にクールですが、なぜこの結果が返されるのかわかりませんsource.relativize(dir)。を返し../ToBeCopied、次にdestinationFolder.resolve(../ToBeCopied)それを返す必要があります (正規化せずに)/home/user/Desktop/Destination/../ToBeCopiedしたがって/home/user/Desktop/ToBeCopied. 私のプログラムが機能しない場合は、自分/ToBeCopied自身をコピーします(それが理にかなっている場合)。実際に何が起こるかというと、どういうわけか、システムは is で使用されている相対的なパターンを取り、source.relativize(dir)「../ToBeCopied1 ステップ戻ってから戻る」ではなく、「1 ステップ戻ってから戻ってくる」のように読み上げます/ToBeCopied。なぜそれが起こるのですか?論理的には、返す/home/user/Desktop/Destination/../ToBeCopied代わりに返す必要があります/home/user/Desktop/Destination。私は何が欠けていますか?よろしくお願いします!
PS:dirは再帰メソッドの現在のディレクトリでpreVisitDirectoryあり、最初の呼び出しはソース自体とまったく同じになります。