Хорошо, Разархивируй Jar, Zip Jar Удачи! Но разархивировать его снова не удается? - PullRequest
0 голосов
/ 16 января 2011

Заголовок говорит все, хотя в методе Java Unzipping он закрывается и выдает эту ошибку:

java.io.FileNotFoundException: ##File hierarchy here#\armor (Access is denied)

Но если я попытаюсь разархивировать с помощью 7-zip, я получу следующие ошибки:

Error: can not delete ouput file: ##File hierarchy here#\armor

Для каждой папки в банке, что означает, что это должно быть проблемой с моим методом архивирования - я надеюсь, что это имеет смысл!

Шаги, которые я предпринял: 1. Разархивировал банку с успехом 2. Успешно застегнул банку 3. Снова разархивируйте, чтобы найти все эти ошибки.

Вот мой способ архивирования:

package minecraftmodmanager;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Tom
 */
public class jarZip {

    public static void zipAll(File Directory, File jar) {
        try {
            JFrame.debugLn("Opening Jos: " + jar.getName() + "... ");
            JarOutputStream jos = new JarOutputStream(new FileOutputStream(jar));
            zip(Directory, "", jos);
            jos.close();
        } catch (IOException ex) {
            Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void zip(File Directory, String Hierarchy, JarOutputStream jos) {
        try {
            BufferedInputStream in = null;
            File[] directoryFiles = Directory.listFiles();
            JFrame.debug("JOS Opened!");
            System.out.println();

            String FullDirectoryPath = Directory.getAbsolutePath() + File.separator;
            String BasePath = FullDirectoryPath.substring(0, FullDirectoryPath.lastIndexOf(File.separator) + 1);
            JFrame.debug("BasePath: " + BasePath);

            for (int FileNumber = 0; FileNumber < directoryFiles.length; FileNumber++) {

                String name = directoryFiles[FileNumber].getPath();
                String JarFileName = name.replace(BasePath, "");
                String FullFileHierarchy = Hierarchy + JarFileName;

                if (directoryFiles[FileNumber].isDirectory()) {
                    zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
                }

                JFrame.debug("name: " + FullFileHierarchy);
                JarEntry entry = new JarEntry(FullFileHierarchy);
                jos.putNextEntry(entry);
                if(!directoryFiles[FileNumber].isDirectory()) {
                in = new BufferedInputStream(new FileInputStream(directoryFiles[FileNumber]));

                byte[] buffer = new byte[1024];
                while (true) {
                    int count = in.read(buffer);
                    if (count == -1) {
                        break;
                    }
                    jos.write(buffer, 0, count);
                }
                jos.closeEntry();
            } else {
                 jos.closeEntry();
            }

            }

        } catch (Exception ex) {
            Logger.getLogger(jarZip.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Ценится, ребята! Как-то новенький здесь, так что "пошли меня вон, если я не следую и правила

1 Ответ

0 голосов
/ 17 января 2011

Я не совсем уверен, но я думаю, что ваша проблема может быть в том, что вы пытаетесь испортить фактические папки. Вам не нужно - когда придет время извлекать файлы, распаковщик или архиватор создаст папки на основе путей к файлам jar или zip.

Если вы добавите продолжение, где вы вызываете zip в подкаталогах, например

    if (directoryFiles[FileNumber].isDirectory()) {
                zip(directoryFiles[FileNumber], FullFileHierarchy + "/", jos);
                continue;
            } 

Это должно рекурсивно добавлять ваши файлы, не добавляя папки.

Несмотря на то, что вы проверяли, что вы пытаетесь читать только из файлов, вы все еще пытались вставить папки в JarOutputStream

            JarEntry entry = new JarEntry(FullFileHierarchy);
            jos.putNextEntry(entry);
            if(!directoryFiles[FileNumber].isDirectory()) {

JarOutputStream подумал, что вы делаете файл, у которого вообще нет содержимого, и имя которого совпадает с именем одной из ваших папок. Поэтому, когда приходит время разархивировать, он создает папку и файл с одинаковым именем.

Если это работает для вас, вы, вероятно, можете соответственно пересмотреть остальную часть своего кода.

Надеюсь, это поможет: -)

...