我完全理解使用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;
}
此代码段取自here(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
将自我复制(如果有意义的话)。实际发生的是,在某种程度上,系统采用source.relativize(dir)
中使用的相对模式../ToBeCopied
并读取类似“返回一步然后回归”的内容,而不是“返回一步然后返回到/ToBeCopied
“。为什么会这样呢?逻辑上应该返回/home/user/Desktop/Destination/../ToBeCopied
而不是返回/home/user/Desktop/Destination
。我错过了什么?
非常感谢提前!
PS:dir
是递归方法preVisitDirectory
的当前目录,第一个调用与源本身完全相同。