Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Java - práce s archivem

Dobrý den,

Mám frame a na něm tlačítko a skrytý textbox

Po zpracování kódu níže potřebuji detekovat, že archiv je zaheslovaný. Pokud ano, tak se ten textbox zobrazí a do něho zadám heslo a archiv se odemkne.

JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "zip"));
int i = fileChooser.showOpenDialog(null);
if (i == JFileChooser.APPROVE_OPTION) {

}

Jenže s archivy jsem nikdy nepracoval a nemám tušení, jak to udělat. Prosím o radu.

Předem díky za odpověď

Předmět Autor Datum
Samotná Java to nejspíš neumí. Koukni na tohle: download.php nový
Wikan 18.12.2016 18:21
Wikan
yes, zip4j is way to go... nový
MaSo 18.12.2016 19:35
MaSo
Děkuji. Už jsem ho našel dřív, akorát jsem se nebyl jistý, jestli mám použít zrovna tenhle. Každopá… nový
MichalDM 29.12.2016 22:09
MichalDM
Při dekompresi dostaneš ZipException s kódem 5. nový
Wikan 29.12.2016 22:27
Wikan
Když zadám špatně heslo, tak to vyhodí net.lingala.zip4j.exception.ZipException: net.lingala.zip4j.… nový
MichalDM 29.12.2016 22:52
MichalDM
try { ZipFile zipFile = new ZipFile(file.getAbsolutePath()); if (zipFile.isEncrypted()) { zipFile.s… nový
MaSo 30.12.2016 00:25
MaSo
Tohle je dobře, ale já nechci, aby se mně to při zadání špatného hesla dostalo do catch, ale jenom a… nový
MichalDM 30.12.2016 10:49
MichalDM
Tak to si to budeš muset přepsat ve zdrojácích toho zip4j. nový
Wikan 30.12.2016 10:52
Wikan
To vážně nemá žádnou metodu, která vrací true nebo false podle toho, jestli je zadané heslo správné?… nový
MichalDM 30.12.2016 13:20
MichalDM
1) Můžeš si napsat svou knihovnu 2) Proč ti vadí catch? Budeš snad louskat miliony archivu za sekund… nový
MašinkaTomáš 30.12.2016 13:34
MašinkaTomáš
Jenom jsem se slušně, takže jestli si jsem přišel jenom mně nadávat, tak laskavě běž obtěžovat někoh… nový
MichalDM 30.12.2016 13:43
MichalDM
kde ti nadavam? nový
MašinkaTomáš 30.12.2016 13:46
MašinkaTomáš
Jde otevřít pro debilky - to není nadávání? nový
MichalDM 30.12.2016 14:24
MichalDM
JaLemu asi vyrostl hrebinek, pritom vi o jave v podstate hovinko. nový
MaSo 30.12.2016 14:37
MaSo
Ne, jen se chovam jako vetsina radcu tady v te poradne. Ano nejsem profik, za to se nestydim. Ale… poslední
MašinkaTomáš 30.12.2016 15:53
MašinkaTomáš
Ne. nový
Wikan 30.12.2016 13:34
Wikan
Už jsem to vyřešil jinak, do catch jsem zavolal znova tu samou metodu. nový
MichalDM 30.12.2016 13:44
MichalDM
Wut? :) Zip4j bohuzel neumi, otestovat jestli je heslo spravne, bez toho aniž by se pokusil archiv… nový
MaSo 30.12.2016 14:27
MaSo

Děkuji. Už jsem ho našel dřív, akorát jsem se nebyl jistý, jestli mám použít zrovna tenhle.

Každopádně pomocí tohohle kódu extrahuji soubor do dané složky.

try {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Archiv", "zip"));
int i = fileChooser.showOpenDialog(null);
if (i == JFileChooser.APPROVE_OPTION) {
ZipFile zipFile = new ZipFile(fileChooser.getSelectedFile().getAbsoluteP ath());
if (zipFile.isEncrypted()) {
zipFile.setPassword(jTextField1.getText());
}
zipFile.extractAll("c:\\ZipTest");
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

Jedinou věc, kterou bych ještě potřeboval, je ověřit, jestli zadané heslo je správné.

Díky.

  try {
            ZipFile zipFile = new ZipFile(file.getAbsolutePath());
            if (zipFile.isEncrypted()) {
                zipFile.setPassword(password);
            }
            zipFile.extractAll("c:\\ZipTest");
        } catch (ZipException ex) {
            if (ex.getCode() == 5) {
                /// tady si pores stav spatneho hesla
            }
         }

Nebo neco nechapu?

Tohle je dobře, ale já nechci, aby se mně to při zadání špatného hesla dostalo do catch, ale jenom aby se splnila nějaká podmínka.

Něco ve stylu tohohle

try {
int pole[] = {0,1,2,3,4,5};
for (int i = 0; ; i++) {
pole[i] = 10 * i;
}
} catch (Exception e) {

}

Cyklus bude běžet, dokud i bude 5. Jakmile budu chtít 6. prvek pole, tak to vyhodí chybu.

Stačí ale, abych upravil cyklus na for (int i = 0; i < pole.length ; i++) a chyba už nenastane.

Ten tvůj kód je první příklad, při chybě skočí do catch, ovšem já to potřebuji upravit tak, aby při špatném hesle se splnila nějaká podmínka a do catch se to nedostalo.

To vážně nemá žádnou metodu, která vrací true nebo false podle toho, jestli je zadané heslo správné? To mně přijde absurdní. Ještě jsem se nesetkal s chybou, která by nešla obejít nějakou podmínkou. Navíc to nevypadá na amatérsky napsanou knihovnu. Jde tam udělat první poslední a není tam testovací metoda pro heslo?

Měl jsem raději hned na začátku uvést příklad

try {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Archiv", "zip"));
int i = fileChooser.showOpenDialog(null);
if (i == JFileChooser.APPROVE_OPTION) {
ZipFile zipFile = new ZipFile(fileChooser.getSelectedFile().getAbsoluteP ath());
if (zipFile.isEncrypted() && zipFile.x(jTextField1.getText()) == true) {
zipFile.extractAll("c:\\ZipTest");
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

ZipFile.x - jméno metody, která otestuje, jestli lze zadaným řetězcem archiv odemknout. (Pokud teda taková metoda existuje)

1) Můžeš si napsat svou knihovnu
2) Proč ti vadí catch? Budeš snad louskat miliony archivu za sekundu?
3) To je úplně běžné že vrací nějaký stav
4) Nenašel jsi dokuemtaci?
5) Používej kurva ten tag code, kdo to má louskat.

6)

private boolean jdeOtevritProDebilky(String psw){

try {
            ZipFile zipFile = new ZipFile(file.getAbsolutePath());
            if (zipFile.isEncrypted()) {
                zipFile.setPassword(psw);
            }
            zipFile.extractAll("c:\\ZipTest");
            
        } catch (ZipException ex) {
            if (ex.getCode() == 5) {
                /// tady si pores stav spatneho hesla
            }
            return false;
         }
         return true;

}

Wut? :)

Zip4j bohuzel neumi, otestovat jestli je heslo spravne, bez toho aniž by se pokusil archiv rozbalit.

Dalo by se to udelat takto, ale je to kapku o nicem, pac se to bude rozbalovat na disk, kdyz bude heslo spravne. Muzes si ale po sobe uklidit.

    public boolean canUnzipFile(File file, String password) {
        try {
            ZipFile zipFile = new ZipFile(file.getAbsolutePath());
            if (zipFile.isEncrypted()) {
                zipFile.setPassword(password);
            }
            zipFile.extractAll("c:\\ZipTest"); // rozbaloval bych do temp folderu
                                               // http://stackoverflow.com/questions/617414/how-to-create-a-temporary-directory-folder-in-java
        } catch (ZipException ex) {
            if (ex.getCode() == 5) {
                return false;
            }
         }

        // tady jeste musis smazat, cos rozbalil
        // http://stackoverflow.com/questions/779519/delete-directories-recursively-in-java
        return true;
    }

Zpět do poradny Odpovědět na původní otázku Nahoru