【问题标题】:Zip4j can't remove or overwrite files inside fileZip4j 无法删除或覆盖文件内的文件
【发布时间】:2020-02-04 14:48:29
【问题描述】:

我正在尝试使用 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();
 }

【问题讨论】:

  • 使用标准 java SE 的 zip 文件系统也是可能的。
  • 很遗憾,这不起作用。我遇到了与上面提到的相同的问题。我可以阅读,但似乎无法修改内容。

标签: java zip4j


【解决方案1】:

Path & Files 支持带有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"));
    }

【讨论】:

  • 我想从外部源复制 odt 内的文件。这将从 odt 中提取文件。我交换了参数并更正了外部参数的来源,但它仍然不起作用。即使使用 Files.delete(),也不会发生任何事情。我仍然可以阅读内容。我不知道这是否是权限问题,但我可以使用 7-zip 编辑内容,所以我认为不会。
  • 我成功地将外部文件复制到 zip 中,复制到原始文件并覆盖现有文件。 Windows 下,Oracle SDK。
  • 可能创建了一个临时 zip 文件或目录树,但没有权限。与 zip4j 相同的问题。也许尝试创建并填充一个临时目录。
最近更新 更多