Boa noite,
Segue código da classe que faz uso desse objeto, com código, informado no post anterior:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Stack;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
*
* @author Anderson C. Fios
* Informações para contato:
* Telefones: (16) 3366-1356 / (16) 9723-5507
* E-mail: afconsultoriaeservicos@gmail.com
* Msn: afconsultoriaeservicos@gmail.com
*/
public class Compactador {
private Exibicao exibicao;
/**
* Contrutor da classe.
*/
public Compactador() {
// Constroi objeto para exibição das mensagens.
this.exibicao = new Exibicao();
// Seta a posição da janela, para o centro.
this.exibicao.setLocationRelativeTo(null);
}
/**
*
* @param arquivoDeEntrada Arquivo a ser comprimodo.
* @param arquivoZip Arquivo de saida com a extensão .zip. Ex: arquivo.zip
* @throws IOException
*/
public void executaProcedimentos(File[] arquivoDeEntrada, File arquivoZip)
throws IOException {
// Exibe a tela que mostra os arquivos.
this.exibicao.setVisible(true);
// Verifica se os parametros passados são validos.
if (arquivoDeEntrada != null && arquivoDeEntrada.length > 0) {
// Prepara arquivo para gravação de informações.
ZipOutputStream out = new ZipOutputStream(
// Cria arquivo de saida.
new FileOutputStream(
// Utiliza a referencia ao arquivo para gerar a saida.
arquivoZip
) // Fecha: FileOutputStream.
); // Fecha: ZipOutputStream.
// Cria pilha com os caminhos do arquivo.
Stack<File> parentDirs = new Stack<File>();
// Executa metodo para compactar arquivos e diretorios.
compactaArquivos(parentDirs, arquivoDeEntrada, out);
// Fecha a saida, terminando o procedimento de compressão de dados.
out.close();
}
this.exibicao.dispose();
}
// Metodo privado criao para ser reaproveitado recursivamente.
private void compactaArquivos(
// Recebe os parametros para execução da compactação.
// Stack = Pilha - Nesse caso especifico uma pilha de arquivos,
// File[] = Vetor de arquivos,
// ZipOuptStream = Arquivo executaProcedimentos.
Stack<File> parentDirs, File[] files, ZipOutputStream out
// Faz com que execeção seja implementada ao usar o metodo.
) throws IOException {
// Prepara espaço na memoria, para, servir de buffer.
byte[] buf = new byte[1024];
// Executa laço para cada arquivo, que compoem a estrutura,
// informada ao metodos
for (int i = 0; i < files.length; i++) {
// Exibe o nome do arquivo que está sendo processado.
this.exibicao.setMensagem(files[i].getName());
// Verifica se o arquivo é um diretorio.
if (files[i].isDirectory()) {
// Se a entrada é um diretório, empilha os arquivos que compoem
// o diretório.
// Prepara a pilha com os arquivos.
parentDirs.push(files[i]);
// Passa os paramentros para o metodo de compactação.
compactaArquivos(parentDirs, files[i].listFiles(), out);
// Após processar as entradas do diretório, desempilha.
parentDirs.pop();
} else {
// Caso não seja um diretorio executa outro procedimento de
// compactação.
// Carrega arquivo a ser compactado em memoria para ser
// manipulado.
FileInputStream in = new FileInputStream(files[i]);
// Itera sobre os itens da pilha para montar o caminho
// completo do arquivo.
String path = "";
for(File parentDir : parentDirs) {
path += parentDir.getName() + "/";
}
// Grava os dados no arquivo executaProcedimentos.
out.putNextEntry(new ZipEntry(path + files[i].getName()));
// Armazena o tamanho do buffer.
int len;
// Abre um laço de repetição, que usa o tamanho do buffer,
// caso o valor, seja superior a 0 continua o processo de
// gravação.
while ((len = in.read(buf)) > 0) {
// Grava a saida processada em disco.
out.write(buf, 0, len);
}
// Finaliza a cessão, para saida.
out.closeEntry();
// Finaliza o espaço em memoria usado para manipulação.
in.close();
}
}
}
Código da classe Main, responsavel, pela execução:
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Kaos
*/
public class Main {
public static void main(String args[]) {
Compactador compactador = new Compactador();
File entrada = new File("E:/backup/Empresa");
File saidaZip = new File("E:/backup/backup/arquivo.zip");
try {
compactador.executaProcedimentos(entrada.listFiles(), saidaZip);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Até aqui funciona por completo, compacta e exibe o status. O código abaixo já da o problema, ou seja, compacta mas não mostra a janela.
private MenuItem getItemBackup() {
// Constroi objeto que vai ser repassado pelo retorno.
MenuItem itemBackup = new MenuItem("Copiar");
// Metodo responsavel pela contrucao do evento.
ActionListener acao = new ActionListener() {
// Implementa o metodo personalizado.
@Override
public void actionPerformed(ActionEvent e) {
if(tarefaEmAndamento.getSituacao()) {
trayIcon.displayMessage(
// Exibe titulo do aviso.
"Aguarde...",
// Exibe a mensagem.
"Sistema ocupado!",
// Seleciona o icone.
TrayIcon.MessageType.WARNING);
} else {
tarefaEmAndamento.setSituacao();
String status = "";
int resposta = JOptionPane.showConfirmDialog(
null,
"Confirma a execução da cópia?",
"Confirmação",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE
);
if(resposta == 0) {
try {
AfBackUp afbackup = new AfBackUp();
if(afbackup.executaCompactacao()) {
status = "Cópia executada!";
} else {
status = "Problema durante cópia!";
}
trayIcon.displayMessage(
// Exibe o titulo do aviso.
"Informação",
// Exibe a mensagem.
status,
// Seleciona o icone.
TrayIcon.MessageType.INFO
);
} finally {
tarefaEmAndamento.setSituacao();
}
} else {
tarefaEmAndamento.setSituacao();
}
}
}
};
// Adiciona acao ao item.
itemBackup.addActionListener(acao);
return itemBackup;
}
Sinceramente, não estou vendo onde está o problema…
[]s