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)
「../ToBeCopied
1 ステップ戻ってから戻る」ではなく、「1 ステップ戻ってから戻ってくる」のように読み上げます/ToBeCopied
。なぜそれが起こるのですか?論理的には、返す/home/user/Desktop/Destination/../ToBeCopied
代わりに返す必要があります/home/user/Desktop/Destination
。私は何が欠けていますか?よろしくお願いします!
PS:dir
は再帰メソッドの現在のディレクトリでpreVisitDirectory
あり、最初の呼び出しはソース自体とまったく同じになります。