2010-03-31 14 views
7

que había creado un archivo zip (junto con el directorio) en Windows de la siguiente manera (Código se recogen de http://www.exampledepot.com/egs/java.util.zip/CreateZip.html):Crear Zip archivos en Windows y extraer archivos Zip En Linux

package sandbox; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

/** 
* 
* @author yan-cheng.cheok 
*/ 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // These are the files to include in the ZIP file 
     String[] filenames = new String[]{"MyDirectory" + File.separator + "MyFile.txt"}; 

     // Create a buffer for reading the files 
     byte[] buf = new byte[1024]; 

     try { 
      // Create the ZIP file 
      String outFilename = "outfile.zip"; 
      ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename)); 

      // Compress the files 
      for (int i=0; i<filenames.length; i++) { 
       FileInputStream in = new FileInputStream(filenames[i]); 

       // Add ZIP entry to output stream. 
       out.putNextEntry(new ZipEntry(filenames[i])); 

       // Transfer bytes from the file to the ZIP file 
       int len; 
       while ((len = in.read(buf)) > 0) { 
        out.write(buf, 0, len); 
       } 

       // Complete the entry 
       out.closeEntry(); 
       in.close(); 
      } 

      // Complete the ZIP file 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

El archivo zip recién creado puede ser extraído sin problemas en Windows, usando http://www.exampledepot.com/egs/java.util.zip/GetZip.html

Sin embargo, me doy cuenta de que si extraigo el archivo zip recién creado bajo Linux, usando la versión modificada de http://www.exampledepot.com/egs/java.util.zip/GetZip.html. La versión original no comprueba el directorio utilizando zipEntry.isDirectory()).

public static boolean extractZipFile(File zipFilePath, boolean overwrite) { 
    InputStream inputStream = null; 
    ZipInputStream zipInputStream = null; 
    boolean status = true; 

    try { 
     inputStream = new FileInputStream(zipFilePath); 

     zipInputStream = new ZipInputStream(inputStream); 
     final byte[] data = new byte[1024]; 

     while (true) { 
      ZipEntry zipEntry = null; 
      FileOutputStream outputStream = null; 

      try { 
       zipEntry = zipInputStream.getNextEntry(); 

       if (zipEntry == null) break; 

       final String destination = Utils.getUserDataDirectory() + zipEntry.getName(); 

       if (overwrite == false) { 
        if (Utils.isFileOrDirectoryExist(destination)) continue; 
       } 

       if (zipEntry.isDirectory()) 
       { 
        Utils.createCompleteDirectoryHierarchyIfDoesNotExist(destination); 
       } 
       else 
       { 
        final File file = new File(destination); 
        // Ensure directory is there before we write the file. 
        Utils.createCompleteDirectoryHierarchyIfDoesNotExist(file.getParentFile()); 

        int size = zipInputStream.read(data); 

        if (size > 0) { 
         outputStream = new FileOutputStream(destination); 

         do { 
          outputStream.write(data, 0, size); 
          size = zipInputStream.read(data); 
         } while(size >= 0); 
        } 
       } 
      } 
      catch (IOException exp) { 
       log.error(null, exp); 
       status = false; 
       break; 
      } 
      finally { 
       if (outputStream != null) { 
        try { 
         outputStream.close(); 
        } 
        catch (IOException exp) { 
         log.error(null, exp); 
         break; 
        } 
       } 

       if (zipInputStream != null) { 
        try { 
         zipInputStream.closeEntry(); 
        } 
        catch (IOException exp) { 
         log.error(null, exp); 
         break; 
        } 
       } 
      } 

     } // while(true) 
    } 
    catch (IOException exp) { 
     log.error(null, exp); 
     status = false; 
    } 
    finally { 
     if (zipInputStream != null) { 
      try { 
       zipInputStream.close(); 
      } catch (IOException ex) { 
       log.error(null, ex); 
      } 
     } 

     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException ex) { 
       log.error(null, ex); 
      } 
     } 
    } 
    return status; 
} 

"MiDirectorio \ MyFile.txt" en lugar de ser puesto bajo MyFile.txt MiDirectorio carpeta.

trato de resolver el problema cambiando el código de creación de archivo zip a

String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"}; 

Pero, ¿es esto una solución elegible, por no modificable del separador? ¿Funcionará bajo Mac OS? (No tengo una Mac para probar)

Respuesta

1

Sí, su solución (aunque aparentemente poco elegante) es la correcta. El "/" debe usarse dentro de zipentry, no en el archivo local. Separador

Cuestiones relacionadas