Zipar com Java - Transformar método que zipa arquivo em método que zipe também pastas

10 respostas
A

Olá,
gostaria de ajuda para conseguir zipar uma pasta qualquer. O método abaixo consegue apenas zipar arquivos individuais. Sei que devo
implementar recursivadade mas está meio complicado de fazer. Qualquer ajuda será bem vinda.

public static void main(String argv[]) {
		try {
			compactarParaZip("c:\\teste50\\1.exe", "c:\\teste50\\1.zip");
		} catch (IOException e) {
			e.printStackTrace();
		}		
	}
public static void compactarParaZip(String arqEntrada,String arqSaida) throws IOException {
		int TAMANHO_BUFFER = 10000000;
		int cont = 0;
		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);
			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());
		}
	}

10 Respostas

Paulo_Silveira

Voce pode invocar recursivamente quando for diretorio, passando todos os arquivos contidos nele.

Mas ha projetos que ja fazem isso:
http://commons.apache.org/compress/

A

Paulo, e quanto à este método:

// if you don't need to specify a name  
	static void zip(File file, ZipOutputStream zos) throws IOException  
	{  
	    zip(file, file.getName(), zos);  
	}
// name is the name for the file  
	static void zip(File file, String name, ZipOutputStream zos) throws IOException  
	{  
	    if (file.isDirectory())  
	    {  
	        File[] files = file.listFiles();  
	        if (files != null) // always check, in case the folder can't be read  
	        {  
	            for (File f: files)  
	            {  
	                String childName = name + "/" + f.getName();  
	                zip(f, childName, zos);  
	            }  
	        }  
	    }  
	    else  
	    {  
	        // zip the file using the given name  
	    }  
	}

Saberia me dizer como passo o diretório destino para o objeto ZipOutputStream -> ZipOutputStream zos?

A

Paulo, vc poderia me dar um exemplo de uso dessa biblioteca? Para gerar .zip de uma pastinha…

A

Definitivamente não há bons exemplos na Internet pelo menos não encontrei… Se puder dar algum exemplo seria ótimo.

Abraço,
AS

Paulo_Silveira

basta passar o diretorio que voce quer como File, no primeiro argumento que esse metodo zip recebe, ja que ele mesmo verifica se é diretorio.

A

Tem algum código pra servir base?

A

Ou poderia me ajudar neste método ele dá pau ler diretorio...

//método para compactar arquivo e ou diretorio
      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));
             
               for (int i = 0; i < arqEntrada.length; i++) {
				
            	   File file = new File(arqEntrada[i]);
                   
                   if(file.isDirectory()){
                       for (File arquivos : file.listFiles()) {
                           [b]streamDeEntrada = new FileInputStream(arquivos); // DA PAU!!!
[/b]                           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());
           }
      }
A

Melhor dizendo… Não dá pau não… Ele funciona quero dizer que faz o seguinte:

ex: vc tem uma pasta chamada pasta1 e dentro dela é um arquivo chamado arquivo1 e compacta junto com um arquivo chamado arquivo 2 -> ele compacta, só q quando vc descompacta aparece assim: arquivo1 e arquivo2 e não pasta1/arquivo1 e arquivo2.

J

http://www.guj.com.br/java/69603-tem-como-zipar-uma-pasta-inteira-em-vez-de-arquivos

A

Oi joyle, estou testando já… Muito obrigado pela atenção…

Criado 18 de janeiro de 2011
Ultima resposta 19 de jan. de 2011
Respostas 10
Participantes 3