Zip4j не может удалять или перезаписывать файлы внутри файла - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь редактировать содержимое файла odt с помощью zip4j (я пытался использовать 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 Ответ

1 голос
/ 04 февраля 2020

Файловая система zip с протоколом jar:file: поддерживается Path & Files. Path поддерживает свою файловую систему, поэтому можно использовать все операции.

    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"));
    }
...