Here you can find the source of zip(String zipName, String[] fileNames, boolean path)
static public void zip(String zipName, String[] fileNames, boolean path) throws IOException, FileNotFoundException
//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(); //---------------------- } } }