1

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 メソッド)。の名前を に変更したので、少し修正しましtargetdestinationFolder

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あり、最初の呼び出しはソース自体とまったく同じになります。

4

0 に答える 0