我正在将文件从jar复制到本地文件夹。
a/b
。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
中的a
。 c
是jar b
内部的资源(文件夹)。 x
是文件夹c
中的文件。
所以:
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)
截断路径。
为了获得目标路径,需要将源路径转换为字符串,以防止合并两个不同的文件系统。
(我没有处理子目录。)