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
Wikan 18.12.2016 18:21
Wikan
yes, zip4j is way to go...
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á…
MichalDM 29.12.2016 22:09
MichalDM
Při dekompresi dostaneš ZipException s kódem 5.
Wikan 29.12.2016 22:27
Wikan
Když zadám špatně heslo, tak to vyhodí net.lingala.zip4j.exception.ZipException: net.lingala.zip4j.…
MichalDM 29.12.2016 22:52
MichalDM
try { ZipFile zipFile = new ZipFile(file.getAbsolutePath()); if (zipFile.isEncrypted()) { zipFile.s…
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…
MichalDM 30.12.2016 10:49
MichalDM
Tak to si to budeš muset přepsat ve zdrojácích toho zip4j.
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é?…
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…
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…
MichalDM 30.12.2016 13:43
MichalDM
kde ti nadavam?
MašinkaTomáš 30.12.2016 13:46
MašinkaTomáš
Jde otevřít pro debilky - to není nadávání?
MichalDM 30.12.2016 14:24
MichalDM
JaLemu asi vyrostl hrebinek, pritom vi o jave v podstate hovinko.
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.
Wikan 30.12.2016 13:34
Wikan
Už jsem to vyřešil jinak, do catch jsem zavolal znova tu samou metodu.
MichalDM 30.12.2016 13:44
MichalDM
Wut? :) Zip4j bohuzel neumi, otestovat jestli je heslo spravne, bez toho aniž by se pokusil archiv…
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.

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