Java Zip File zip(String zipName, String[] fileNames, boolean path)

Here you can find the source of zip(String zipName, String[] fileNames, boolean path)

Description

zip

License

Open Source License

Declaration

static public void zip(String zipName, String[] fileNames, boolean path)
        throws IOException, FileNotFoundException 

Method Source Code

//package com.java2s;
/*/*w  ww  .j av a 2s  .c o m*/
 * ISABEL: A group collaboration tool for the Internet
 * Copyright (C) 2009 Agora System S.A.
 * 
 * This file is part of Isabel.
 * 
 * Isabel is free software: you can redistribute it and/or modify
 * it under the terms of the Affero GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Isabel is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Affero GNU General Public License for more details.
 * 
 * You should have received a copy of the Affero GNU General Public License
 * along with Isabel.  If not, see <http://www.gnu.org/licenses/>.
 */

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

public class Main {
    public static final int NO_PATH = 0;
    public static final int RELATIVE_PATH = 1;
    public static final int ABSOLUTE_PATH = 2;
    public static final String FILE_SEPARATOR = System.getProperty("file.separator");
    public static final String XLIM_LOGS_WORK_DIR = System.getProperty("user.home") + FILE_SEPARATOR + ".xlim"
            + FILE_SEPARATOR + "logs" + FILE_SEPARATOR;

    /**
     * Comprime ficheros.
     * @param zipName fichero zip donde se comprimiran los ficheros
     * @param fileNames array que contiene los paths de los ficheros que queremos comprimir
     * @param path indica si se guardan los paths de los ficheros (absolutos) o no. true para mantener el path absoluto; false para no guardar paths 
     * @param relativePaths array para indicar cual es el path relativo de cada fichero que se quiere comprimir
     * @return
     * @throws
     *
     */
    static public void zip(String zipName, String[] fileNames, boolean path)
            throws IOException, FileNotFoundException {
        int pathMode;
        if (path)
            pathMode = ABSOLUTE_PATH;
        else
            pathMode = NO_PATH;
        String[] relativePaths = null;
        zip(zipName, fileNames, pathMode, relativePaths);
    }

    /**
     * Comprime ficheros.
     * @param zipName fichero zip donde se comprimiran los ficheros
     * @param fileNames array que contiene los paths de los ficheros que queremos comprimir
     * @param path indica si se guardan los paths de los ficheros (relativos o absolutos) 
     * o no. Valores posibles: NO_PATH, RELATIVE_PATH, ABSOLUTE_PATH.
     * @param relativePaths array para indicar cual es el path relativo de cada 
     * fichero que se quiere comprimir. Solo se usa cuando path=RELATIVE_PATH e 
     * indica que parte del path del fichero se eliminara al comprimirlo.
     * @throws
     *
     */
    static public void zip(String zipName, String[] fileNames, int path, String[] relativePaths)
            throws IOException, FileNotFoundException {
        // Create a buffer for reading the files
        // Donde mandamos los mensajes de trazas: 
        PrintWriter outTraceFile = null;
        outTraceFile = new PrintWriter(
                new BufferedWriter(new FileWriter(XLIM_LOGS_WORK_DIR + FILE_SEPARATOR + "zip.log", true)), true);
        outTraceFile.println("zipName: " + zipName);
        // Create the ZIP file
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipName));
        // Compress the files
        for (int i = 0; i < fileNames.length; i++) {
            // File asociated to this file...
            outTraceFile.println("fileNames[" + i + "]: " + fileNames[i]);
            File file = new File(fileNames[i]);
            String relativePath = "";
            // Si no queremos guardar la ruta, el relativePath correspondiente es todo 
            // el path, menos el nombre del fichero.
            //if (path == NO_PATH) relativePath = fileNames[i].substring(0,fileNames[i].length()-getBaseName(fileNames[i]).length());
            if (path == NO_PATH)
                relativePath = getRoot(fileNames[i]) + getRootName(fileNames[i]);
            if (path == RELATIVE_PATH)
                relativePath = relativePaths[i];
            if (path == ABSOLUTE_PATH) {
                // Con esto, conseguimos que el getPath que se usa en zipOneFile de como resultado el path absoluto
                file = new File(file.getAbsolutePath());
                relativePath = getRoot(file.getAbsolutePath());
            }
            outTraceFile.println("relativePath value: " + relativePath);
            zipOneFile(file, out, relativePath);
        }
        // Complete the ZIP file
        out.close();
    }

    /**
     * Dado un path de un fichero, devuelve el root de un fichero, es decir, "/" en linux
     * o "X:\" en windows, si es que se encuentran en el nombre dado.
     * @param name el el path del fichero
     * @return el rootname, es decir, la ruta para llegar al fichero.
     *
     */
    static public String getRoot(String name) {
        // Primero vemos cual es el separador en este path
        String separator;
        int cont = name.indexOf("/");
        if (cont != -1) {
            separator = "/"; // Path de linux, en windows no puede haber ficheros con \. 
            if (cont == 0)
                return "/";
            else
                return "";
        } else {
            if (name.indexOf("\\") != -1) {
                separator = "\\"; // Path de windows, en linux no puede haber nombres de ficheros con \
                // En windows quitamos la letra del disco donde esta el fichero. Usamos los : para quitarla
                cont = name.indexOf(":");
                if (cont != -1)
                    return name.substring(0, cont + 2);
                else
                    return "";
            } else
                return "";
        }
    }

    /**
     * Dado un path de un fichero, devuelve la ruta de ese fichero, es decir, la lista
     * de directorios en los que esta el fichero
     * @param name el el path del fichero
     * @return el rootname, es decir, la ruta para llegar al fichero.
     *
     */
    static public String getRootName(String name) {
        // Primero vemos cual es el separador en este path
        String separator;
        int cont = name.indexOf("/");
        if (cont != -1) {
            separator = "/"; // Path de linux, en windows no puede haber ficheros con \. 
            if (cont == 0)
                name = name.substring(1);
            return name.substring(0, name.lastIndexOf(separator) + 1);
        } else {
            if (name.indexOf("\\") != -1) {
                separator = "\\"; // Path de windows, en linux no puede haber nombres de ficheros con \
                // En windows quitamos la letra del disco donde esta el fichero. Usamos los : para quitarla
                cont = name.indexOf(":");
                if (cont != -1)
                    name = name.substring(cont + 2);
                return name.substring(0, name.lastIndexOf(separator) + 1);
            } else
                return "";
        }
        // Eliminamos el primer / si lo hubiese (en linux) y la letra (en windows)

    }

    /**
     * Introduce un fichero en el stream de zip.
     * @param file Fichero que queremos introducir en el stream
     * @param out stream de zip donde metemos el fichero que queremos comprimir
     * @Author lailoken
     */
    static private void zipOneFile(File file, ZipOutputStream out, String relativePath)
            throws IOException, FileNotFoundException {
        // Donde mandamos los mensajes de trazas: 
        PrintWriter outTraceFile = new PrintWriter(
                new BufferedWriter(new FileWriter(XLIM_LOGS_WORK_DIR + FILE_SEPARATOR + "zip.log", true)), true);
        if (file.isDirectory()) {
            outTraceFile.println("Zipping..." + file.getPath());
            //Create an array with all of the files and subdirectories
            //of the current directory.
            String[] fileNamesInDir = file.list();
            if (fileNamesInDir != null) {
                //Recursively add each array entry to make sure that we get 
                //subdirectories as well as normal files in the directory.
                for (int i = 0; i < fileNamesInDir.length; i++) {
                    zipOneFile(new File(file, fileNamesInDir[i]), out, relativePath);
                }
            }
        }
        //Otherwise, a file so add it as an entry to the Zip file.
        else {
            //----- For each file --
            outTraceFile.println("Zipping..." + file.getPath());
            byte[] buf = new byte[1024];
            FileInputStream in = new FileInputStream(file);
            // Add ZIP entry to output stream.
            // Sacamos el nombre de la entry de quitarle al nombre del fichero su relativePath:
            outTraceFile.println("filePath: " + file.getPath() + "; relativePath: " + relativePath);
            String entryName;
            // Para generar el entryName hay que asegurarnos  de que le hemos dejado el path relativo pedido
            entryName = file.getPath().substring(relativePath.length(), file.getPath().length());
            // ...y de que los separadores de directorio son /
            outTraceFile.println("EntryName: " + entryName);
            entryName = entryName.replaceAll("\\\\", "/");
            outTraceFile.println("EntryName: " + entryName);
            out.putNextEntry(new ZipEntry(entryName));
            // 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();
            //----------------------
        }
    }
}

Related

  1. zip(String src, String dest, PrintStream stream)
  2. zip(String srcPath)
  3. zip(String zipFileName, Map entries)
  4. zip(String zipFileName, String inputFile)
  5. zip(String zipFileName, String[] zipEntries)
  6. zip(String zipPath, Map input)
  7. zipFile(File aFileToZip)
  8. zipFile(File file)
  9. zipFile(File file, File output)