相对论引入了冗余的up目录“.”

xu3bshqb  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(276)

我正在将文件从jar复制到本地文件夹。
jar位于 a/b .
我试图提取的文件夹(在jar中)位于 b/c 目标文件夹应为 z ,即。 a/b/c/x -> z/x 当我使用 c.relativize("x") 我明白了 ../c/x 而不是 x .
当我尝试这样做时,这是一个问题: z.resolve(c.relativize(x)) .
我明白了 z/../c/x 而不是 z/x 如何解决此问题?
我试过了 z.resolve(c.relativize(x).normalise()) 但得到同样的结果
jar是空的 b 在文件夹中 a . c 是jar中的一个资源(文件夹) b . x 是文件夹中的文件 c .

9rnv2umw

9rnv2umw1#

jar在文件夹a/b中/
jar中的源文件夹路径是/b/c/with file/b/c/.yyy
目标文件夹是z
目标文件的路径应为:z/.yyy
所以:

Path sourceZip = Paths.get("/A/B/my.zip");
    URI sourceZipURI = URI.create("jar:" + sourceZip.toUri());

    Path targetFolder = Paths.get("/Z");

    Map<String, Object> senv = new HashMap<>();
    try (FileSystem sourceZipFS = FileSystems.newFileSystem(sourceZipURI, senv, null)) {
        Path folderInZip = sourceZipFS.getPath("/b/c");
        Files.list(folderInZip).forEach(p -> {
            Path target = targetFolder.resolve(folderInZip.relativize(p).toString());
            try {
                Files.createDirectories(target.getParent());
                Files.copy(p, target);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

主要的问题是 relativize ; 我不是第一次遇到这种误解。 child.relativize(parent) 给一个 .. 鉴于 parent.relativize(child) 截断路径。
要获得目标路径,需要将源路径转换为字符串,以防止合并两个不同的文件系统。
(我没有处理子目录。)

jexiocij

jexiocij2#

我想你误解了 path.relativize(Path) 根据https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/path.html#relativize(java.nio.file.path),有如下语句:
在该路径和给定路径之间构造相对路径。
例如

Path pathA = Paths.get("a"); // i.e. /a or /anyDir/anySubDir/a
Path pathB = Paths.get("b"); // i.e. /b or /anyDir/anySubDir/b
pathA.relativize(pathB)

假设结果是 ../b ,这是什么意思?
它实际上是在告诉你:因为你在目录里面 a ,如果要访问目录 b ,您需要通过此方法访问 cd ../b . relativize(Path) 有助于分析父路径和子路径之间的相对路径(即如何从父路径访问子路径)。
或者,从您的问题来看,您更喜欢“构造”路径,而不是“分析”相对路径。 relativize(Path) 不是为了这个目的。
那么,你想实现哪一个“手工构造”还是“分析”?

相关问题