Хорошо, распакуйте банку, застегните банку, успех! Но разархивировать его снова не удается?

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

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

Уважаемые ребята! Вроде новичок здесь, так что извините меня, если я не следовал правилам


person Thomas Nairn    schedule 16.01.2011    source источник
comment
Вы можете начать с написания минимального примера, воспроизводящего проблему.   -  person stepancheg    schedule 17.01.2011
comment
Я предполагаю, что, возможно, другой процесс открыл дескрипторы разархивированных файлов (из первого распаковывания). Когда вы снова пытаетесь разархивировать, целевые файлы уже существуют и должны быть удалены, но, поскольку они заблокированы отдельным процессом, доступ для этого удаления запрещен.   -  person Andrzej Doyle    schedule 17.01.2011


Ответы (1)


Я не совсем уверен, но я думаю, что ваша проблема может заключаться в том, что вы пытаетесь исказить настоящие папки. Вам не нужно — когда придет время распаковывать файлы, распаковщик или распаковщик создаст папки на основе путей файлов 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 думал, что вы создаете файл, у которого вообще нет содержимого, и он был назван так же, как одна из ваших папок. Поэтому, когда приходит время разархивировать, создается и папка, и файл с тем же именем.

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

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

person Zach L    schedule 16.01.2011
comment
Вот и все, хотя я уже решил это, спасибо, что нашли время, ребята! :) - person Thomas Nairn; 17.01.2011