Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47

    Java: unzippare che a sua volta contiene altre cartelle

    Ciao, Ho un problema che non risco a risolvere. Scarico da internet sul mio cell android un file pippo.zip. Ora devo unzippare tale file in una cartella che stia nella stessa directory dello zip e che abbia lo stesso nome........ovvero in questo caso devoc reare la cartella pippo.

    Su internet ci sono tantissimo esempi, ma con tutti ho lo stesso problema, ovvero se il mio pippo.zip contiene solo file 1,10,100 tutto funziona........se invece il file contiene dell cartelle non funziona una mazza.
    Della serie dentro il file zip ho file1.mp3 e una cartella Myfolder che a sua volta contiene file2.mp3
    e file3.mp3
    pippo.zip->
    Myfolder->
    file2
    file3
    file1.


    In quest caso lui scorre le entri, ma quando becca la cartella quello che io mi aspetto è che riconosca che è una cartella e ne crei una, dopo di che guardi il contenuto veda che sono file e li copi nella cartella appena creata. Poi trova file1 e lo mette invece sotto la cartella principale(cmq è ininfluente l'ordine con cui scorre i file all'interno.

    Il mio codice è questo:
    codice:
    public ArrayList unzip(InputStream inputStream, String destinationDir) throws IOException 
    { 
            ArrayList result = null; final int BUFFER = 2048;
            if (inputStream != null && destinationDir != null) 
        {
            result = new ArrayList();
            ZipInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
                zis = new ZipInputStream(new BufferedInputStream(inputStream));
                ZipEntry entry = null;
                while((entry = zis.getNextEntry()) != null) 
                { //for each zip entry
                    if (entry.isDirectory()) 
                    { //directory
                        File dir = new File(destinationDir + File.separator + entry.getName());
                        dir.mkdirs();
                    } 
                    else 
                    { //file
                        int count;
                        byte data[] = new byte[BUFFER];
                        String fileName = destinationDir + File.separator + entry.getName();
                        FileOutputStream fos = new FileOutputStream(fileName);
                        bos = new BufferedOutputStream(fos, BUFFER);
                        while ((count = zis.read(data, 0, BUFFER)) != -1) {
                            bos.write(data, 0, count);
                        }
                        bos.flush();
                        result.add(fileName);
                    }
                }//next zip entry
                zis.close();
            } 
            finally
            {
                if (bos != null) { try { bos.close(); } catch (IOException ioe) { /* ignore */ } }
                if (zis != null) { try { zis.close(); } catch (IOException ioe) { /* ignore */ } }
            }
        }//else: input value unavailable
    
        return result;
    }

    Da quel che ho capito lui scoorre i file nello zip uno a uno e li mette in entry, poi controlla se sono cartelle o file e prosegue a seconda di quel che ha trovato.
    Il problema è che se io stampo il campo entry, succede che invece d stampare solo folder e entrare nella sezione x gestire le cartelle, lui stampa folder/file2 che vede come il nome di un unico file e poi sclera senza dare nessun esito..........
    Qualcuno mi sa illuminare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    codice:
    public static File unzip(File inFile, File outFolder)
    	 {  final int BUFFER = 2048;
    	      try
    	      {
    	           BufferedOutputStream out = null;
    	           ZipInputStream  in = new ZipInputStream(
    	                                         new BufferedInputStream(
    	                                              new FileInputStream(inFile)));
    	           ZipEntry entry;
    	           while((entry = in.getNextEntry()) != null)
    	           {
    	                //System.out.println("Extracting: " + entry);
    	                int count;
    	                byte data[] = new byte[BUFFER];
    
    	                //We will try to reconstruct the entry directories
    	                File entrySupposedPath = new File(outFolder.getAbsolutePath()+File.separator+entry.getName());
    
    	                //Does the parent folder exist?
    	                if (!entrySupposedPath.getParentFile().exists()){
    	                    entrySupposedPath.getParentFile().mkdirs();
    	                }
    
    
    	                // write the files to the disk
    	                out = new BufferedOutputStream(
    	                          new FileOutputStream(outFolder.getPath() + "/" + entry.getName()),BUFFER);
    
    	                while ((count = in.read(data,0,BUFFER)) != -1)
    	                {
    	                     out.write(data,0,count);
    	                }
    	                out.flush();
    	                out.close();
    	           }
    	           in.close();
    	           return outFolder;
    	      }
    	      catch(Exception e)
    	      {
    	           e.printStackTrace();
    	           return inFile;
    	      }
    	 }
    Questo funziona, non vedo grandi differenze cn quello sopra...........anzi quello sopra mi sembrava fatto meglio, perchè usa il metodo isDirectoryx vedere se è un file o una cartella, peccato che ritorni false anche qundo è davvvero una directori......
    Questo invece se ne sbatte di cosa sta leggendo usamkdirs x ogni entry così è sicuro che non sbaglia...........

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Tempo fa ho scritto questo, che ha sempre funzionato. Anche questo usa isDirectory() per controllare che l'entry sia una directory e comportarsi di conseguenza... ha in più che puoi scegliere di decomprimere anche solo un "ramo" dell'albero di directory dello ZIP (indicato dalla stringa beginEntry):

    codice:
        private static final int BUFSIZE = 2048;
    
        public static boolean decomprimi(File src, File dirOut, String beginEntry) {
            boolean success = false;
            ZipInputStream zipFile = null;
            BufferedOutputStream bos = null;
    
            try {
    
                boolean prosegui = true;
                if ( !dirOut.exists() ) {
                    if ( !dirOut.mkdirs() ) {
                        System.err.println("Impossibile creare la directory di destinazione.");
                        prosegui = false;
                    }
                }
    
                if ( prosegui ) {
                    zipFile = new ZipInputStream( new FileInputStream(src) );
    
                    ZipEntry entry = null;
                    while((entry = zipFile.getNextEntry()) != null) {
                        String entryName = entry.getName();
                        if ( entryName.startsWith(beginEntry) ) {
                            if ( entry.isDirectory() ) {
                                (new File(dirOut, entryName)).mkdirs();
                            } else {
                                int numBytes = 0;
                                byte[] data = new byte[BUFSIZE];
                                File entryOut = new File(dirOut, entryName);
                                FileOutputStream fos = new FileOutputStream( entryOut );
                                bos = new BufferedOutputStream(fos, BUFSIZE);
                                while((numBytes = zipFile.read(data, 0, BUFSIZE)) != -1) {
                                    bos.write(data, 0, numBytes);
                                }
                                bos.flush();
                                bos.close();
                            }
                        }
                    }
    
                    success = true;
                }
    
            } catch (IOException ioe) {
                ioe.printStackTrace();
                success = false;
            } finally {
                if (zipFile != null) {
                    try {
                        zipFile.close();
                    } catch (IOException ioe) { ioe.printStackTrace(); }
                }
            }
    
            return success;
        }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    Curiosità se voglio decomprimere tutto lo zip cosa devo passargli coe stringa?

    Cos'è quel jarfile su cui fai una read? Mi da che nn esiste.......

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da Sgotenks
    Curiosità se voglio decomprimere tutto lo zip cosa devo passargli coe stringa?
    Semplicemente "" (la stringa vuota)

    Cos'è quel jarfile su cui fai una read? Mi da che nn esiste.......
    Un refuso... in realtà è "zipFile".


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.