PDA

View Full Version : [JAVA] Decomprimere cartella contenente sottocartelle e file


miao84
03-12-2009, 11:34
Non riesco a decomprimere da zip, una cartella molto complessa con all'interno molte sottocartelle e file. Ho googlato qua e lą ma ho trovato poco...qualcuno l'ha gią fatto?:mc:

P.S inoltre dovrei gestire le stringhe che iniziano con "Errore", per esempio le due stringhe "Errore xxx" e "Errore xyz" devono essere uguali per me. Come si fa a gestire stringhe cosi??

:help:

PGI-Bis
03-12-2009, 12:59
L'estrazione di uno zip č sequenziale: i suoi elementi sono "finte" cartelle. I passaggi nudi e crudi sono:

import java.io.*;
import java.util.*;
import java.util.zip.*;

public class Unzip {

public static void main(String[] args) throws Throwable { //non si rilascia un Throwable
ZipFile zipFile = new ZipFile(args[0]);
File outDir = new File(args[1]);
for(ZipEntry e : Collections.list(zipFile.entries())) {
File dest = new File(outDir, e.getName());
if(e.isDirectory()) {
dest.mkdirs();
} else {
dest.getParentFile().mkdirs();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
BufferedInputStream in = new BufferedInputStream(zipFile.getInputStream(e));
for(int b = in.read(); b != -1; b = in.read()) { out.write(b); }
out.flush();
out.close(); //va messo in un finally
in.close(); //va messo in un finally
}
}
zipFile.close(); //va messo in un finally
}

}

Naturalmente poi vanno gestite le eccezioni, le conferme per la sovrascrittura e la creazione di cartelle eccetera eccetera.

Per le stringhe, meccanicamente ti interessa "startsWith":

if(stringa.startsWith("Errore")) { ... }

In generale l'identitą di un oggetto con un altro č una questione abbastanza intima da consigliare l'incapsulamento, tipo:

public class Messaggio {
private static final String ERRORE = "Errore";
private final int HASH;
private final String CONTENT;

public Messaggio(String content) {
CONTENT = content;
if(CONTENT.startsWith(ERRORE)) {
HASH = ERRORE.hashCode();
} else {
HASH = CONTENT.hashCode();
}
}

public int hashCode() {
return HASH;
}

public boolean equals(Object that) {
return (that instanceof Messaggio) && (that.hashCode() == this.hashCode());
}

public String toString() {
return CONTENT;
}
}

A quel punto per ogni stringa crei un messaggio e i vari messaggi sanno da sč quando devono essere uguali pur facendo riferimento a stringhe diverse.

miao84
03-12-2009, 13:42
GRAZIE MILLE!! funzionamento corretto per tutte e due le cose!!!:D :D :D :D