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

PS:dir是递归方法的当前目录,preVisitDirectory第一次调用会和源本身完全一样。

4

0 回答 0