我彻底理解了 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
它会自我复制(如果有意义的话)。实际发生的情况是,系统以某种方式采用source.relativize(dir)
其中使用的相对模式,../ToBeCopied
并读取诸如“后退一步然后返回”之类的内容,而不是“后退一步然后返回/ToBeCopied
”。为什么会发生呢?逻辑上应该回馈/home/user/Desktop/Destination/../ToBeCopied
而不是返回/home/user/Desktop/Destination
。我错过了什么?提前非常感谢!
PS:dir
是递归方法的当前目录,preVisitDirectory
第一次调用会和源本身完全一样。