z/x 当我使用 c.relativ-6ren">
gpt4 book ai didi

java - Relativise引入冗余上行目录 ".."

转载 作者:行者123 更新时间:2023-12-01 18:27:19 25 4
gpt4 key购买 nike

我将文件从 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 位于文件夹 a 中的 bc 是 jar b 内的资源(文件夹)。 x 是文件夹 c 内的文件。

最佳答案

  • 该 jar 位于文件夹 A/B/
  • jar 内的源文件夹路径为/b/c/,文件为/b/c/xxx.yyy
  • 目标文件夹是 Z
  • 目标文件的路径应为:Z/xxx.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();
}
});
}

主要问题是相对化的逆转;我不是第一次遇到这种误解。 child.relativize(parent) 给出 ..parent.relativize(child) 截断路径。

要获取目标路径,需要将源路径转换为字符串,以防止组合两个不同的文件系统。

(我没有处理子目录。)

关于java - Relativise引入冗余上行目录 "..",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60211449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com