Criar pasta zipada

3 respostas
LucasAdri07

Boa tarde.

Estou com um problema:

Tenho essa classe que zipa arquivos e pastas:

import  java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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;

public class CompactadorZip {
   
   //Constantes
   static final int TAMANHO_BUFFER = 4096; // 4kb
   
   //método para compactar arquivo
   public static void compactarParaZip(String arqSaida,String arqEntrada) throws IOException{
       int cont;
       byte[] dados = new byte[TAMANHO_BUFFER];
                   
       BufferedInputStream origem = null;
       FileInputStream streamDeEntrada = null;
       FileOutputStream destino = null;
       ZipOutputStream saida = null;
       ZipEntry entry = null;
              
       try {
            destino = new FileOutputStream(new File(arqSaida));
            saida = new ZipOutputStream(new BufferedOutputStream(destino));
            File file = new File(arqEntrada);
            if(file.isDirectory()){
                for (File arquivos : file.listFiles()) {
                    streamDeEntrada = new FileInputStream(arquivos);
                    origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);
                    entry = new ZipEntry(arquivos.getName());
                    saida.putNextEntry(entry);
                    while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {
                        saida.write(dados, 0, cont);
                    }
                }
            }else{
                streamDeEntrada = new FileInputStream(file);
                origem = new BufferedInputStream(streamDeEntrada, TAMANHO_BUFFER);
                entry = new ZipEntry(file.getName());
                saida.putNextEntry(entry);
                while((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {
                    saida.write(dados, 0, cont);
                }
            }
                       
            origem.close();
            saida.close();
        } catch(IOException e) {
            throw new IOException(e.getMessage());
        }
   }
   
}

E estou testando assim:

package br.com.ultramax.gestao.instalacao.model;

import java.io.IOException;

public class teste {
	   
	   public static void main(String args[]){
	       try {
	           Compactador.compactarParaZip("c:\\Temp\\UltramaxGestao\\Sistemas\\SistProd\\UltraPDV.zip", "c:\\Temp\\UltramaxGestao\\Sistemas\\SistProd\\UltraPDV");
	       } catch (IOException e) {
	           // TODO Auto-generated catch block
	           e.printStackTrace();
	       }
	   }

	}

Porem ele me lança uma exception:

java.io.FileNotFoundException: c:\Temp\UltramaxGestao\Sistemas\SistProd\UltraPDV\DAO (Acesso negado)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at br.com.ultramax.gestao.instalacao.model.Compactador.compactarParaZip(Compactador.java:35)
	at br.com.ultramax.gestao.instalacao.model.teste.main(teste.java:9)

Verifiquei que isso ocorre pois ele não está zipando essa pasta DAO, que existe dentro da pasta UltraPDV.

Como eu poderia zipar as subpastas?

3 Respostas

mauricioadl

tenta algo assim:

public class Compactador {
	private ZipOutputStream zos = null;
	public void zip(File file) {
		try {
			FileOutputStream fos = new FileOutputStream(new File("c:/temp/meuZip.zip"));
			zos = new ZipOutputStream(fos);
			addFile(file);
			zos.flush();
			zos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void addFile(File file) throws IOException{
		if(file.isDirectory()){
			for(File dir : file.listFiles()){
				addFile(dir);
			}
		} else {
			zos.putNextEntry(new ZipEntry(file.getAbsolutePath()));
		}
	}
	public static void main(String[] args) {
		Compactador c = new Compactador();
		c.zip(new File("c:/teste"));
	}
}
Vingdel

Acredito que pode ser problema de falta de privilégios, você está executando como administrador?

Caso não, faça um teste.

[]'s

LucasAdri07

Refiz a classe e agora está funcional:

package br.com.ultramax.gestao.instalacao.model;

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

public class Compactador {
	private ZipOutputStream zos = null;

	public void zip(File origem, File destinoZIP) throws IOException {

		zos = new ZipOutputStream(new FileOutputStream(destinoZIP));
		addFile(origem, zos, origem);
		zos.flush();
		zos.close();
	}

	public void addFile(File arquivo, ZipOutputStream zos, File pastaPrincipal)
			throws IOException {

		if (arquivo.isDirectory()) {

			for (File a : arquivo.listFiles()) {
				addFile(a, zos, pastaPrincipal);
			}

		} else {

			final int TAMANHO_BUFFER = 4096; // 4kb
			int cont;
			byte[] dados = new byte[TAMANHO_BUFFER];

			BufferedInputStream origem = null;
			try {
				origem = new BufferedInputStream(new FileInputStream(arquivo),
						TAMANHO_BUFFER);

				String nomeEntrada = arquivo.getAbsolutePath();

				System.out.println(nomeEntrada);

				if (pastaPrincipal.isDirectory()) {
					nomeEntrada = nomeEntrada.substring(pastaPrincipal
							.getAbsolutePath().length() + 1);
				} else {
					nomeEntrada = arquivo.getName();
				}

				zos.putNextEntry(new ZipEntry(nomeEntrada));

				while ((cont = origem.read(dados, 0, TAMANHO_BUFFER)) != -1) {

					zos.write(dados, 0, cont);
				}

			} finally {
				if (origem != null) {
					origem.close();
				}
			}
		}
	}

	public static void main(String[] args) throws IOException {
		Compactador c = new Compactador();
		c.zip(new File("c:/temp/teste"), new File("c:/temp/meuzip.zip"));
	}
}
Criado 26 de dezembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 3
Participantes 3