引入多余的向上目录“ ..”的相对论

问题描述 投票:0回答:1

我正在将文件从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()),但得到了相同的结果

罐子位于文件夹b中的ac是jar b内部的资源(文件夹)。 x是文件夹c中的文件。

java file nio
1个回答
0
投票
  • 罐子在文件夹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();
            }
        });
    }

主要问题是relativize的反转;不是我第一次遇到误会。 child.relativize(parent)给出..,而parent.relativize(child)截断路径。

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

(我没有处理子目录。)

© www.soinside.com 2019 - 2024. All rights reserved.