Zip4j无法删除或覆盖文件中的文件

时间:2020-02-04 14:48:29

标签: java zip4j

我正在尝试使用zip4j编辑odt文件的内容(我尝试使用java ZipEntries,但是我什至无法从文件本身删除条目,这就是为什么我选择使用库的原因)。我可以确认我要覆盖的文件出口,甚至可以从文件中读取并告诉它是何时创建的,以便零件可以工作。现在,当我尝试编辑odt内容(删除或覆盖)时,Zip4j会引发ZipException,其中说:无法重命名已修改的zip文件。我在做什么错了?

 try
 {
      File temp = new File(f.getParent()+"/tmp/content.xml");
      new File(temp.getParent()).mkdirs();
      FileUtils.write(temp, "", encoding);
      net.lingala.zip4j.ZipFile zf = new net.lingala.zip4j.ZipFile(f.getPath());
      ZipParameters p = new ZipParameters();
      p.setEncryptionMethod(EncryptionMethod.NONE);
      p.setOverrideExistingFilesInZip(true);
      p.setFileNameInZip("content.xml");
      p.setCompressionMethod(CompressionMethod.DEFLATE);
      zf.addFile(temp, p);
 }
 catch (Exception e)
 {
      e.printStackTrace();
 }

1 个答案:

答案 0 :(得分:1)

“路径与文件”支持具有jar:file:协议的zip文件系统。路径维护其文件系统,因此可以使用所有操作。

    Path osPath = Paths.get("C:/ ... .odt");
    URI uri = URI.create("jar:" + osPath.toUri());

    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    try (FileSystem zipFS = FileSystems.newFileSystem(uri, env)) {
        Files.copy(zipFS.getPath("/media/image1.png"), osPath.resolveSibling("image1.png"),
            StandardCopyOption.REPLACE_EXISTING);
        Files.move(zipFS.getPath("/media/image2a.png"), zipFS.getPath("/media/image2.png"));
    }
相关问题