[Resolvido]Criação de Arquivo .CAB em Java

3 respostas
Master.Abs

Boa tarde pessoas.
Estou com um problema onde preciso gerar arquivos .CAB (Microsoft) via Java.
Porém estou procurando em diversos foruns e não consigo nenhuma solução.
Li que com Java Puro não é possível fazer esse processo mas usando Runtime.getRuntime().exec()
é possível criar porém não consigo a visão de como fazer esse processo.
Se alguém conseguiu fazer algo similar, gostaria que me ajudasse a entender como funciona.
Desde já agradeço.

Por favor, só responda se tiver certeza de que sabe.

3 Respostas

luiz_renato

Há muito tempo eu trabalhei num projeto pra WindowsCE com o SuperWaba (atual TotalCross) que possui o utilitário exegen-cab pra gerar cab’s pro WindowsCE que eu usava com ANT , de resto nunca ouvir falar.

Master.Abs

[size=12]Estou pensando em criar um ProcessBuilder passando parametros para um build.xml (Ant) e com isso deixar que o ant gere o .cab.
Não sei se essa é a melhor solução mas se alguém tiver idéia de como fazer ou melhorar o processo, por favor poste.
Vlw
[/size]

Master.Abs

Segue abaixo uma solução para geração de arquivos .CAB através do makecab.exe do windows.

Configuração:

1º Passo - Descompacte o arquivo em anexo cabfiles.rar
2º Passo - Depois de descompactar, abra a pasta BIN e copie o arquivo MAKECAB.EXE
3º Passo - Substitua o arquivo MAKECAB.EXE que está na pasta C:\Windows\System32 pelo MAKECAB.EXE copiado.

Pronto a configuração está feita.

Agora é só criar a classe abaixo e começar a compactar.

/**
 * Classe responsável por gerar arquivos .CAB
 * @author Master Abs
 */
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

public class CABZip {
	/**
	 * Método responsável por gerar .CAB através de pasta pelo MAKECAB da pasta Windows/System32.
	 * @param path - Caminho da pasta que contém os arquivos para compactação.
	 * @throws IOException
	 */
	public static void createCabFile(String path) throws IOException{
		File f = new File(path);
		if(!f.exists()) f.mkdir();
		
		String ddf = createDDF(f.getAbsolutePath());
		
		/* Deve ter o arquivo makecab instalado no C:\Windows\System32 */
		if(System.getProperty("os.name").contains("Windows")){
			StringBuffer cmd = new StringBuffer();
            cmd.append("MAKECAB").append(" /f ").append("\"" + ddf + "\"");
            Runtime.getRuntime().exec(cmd.toString());  
            // Executa a compactação por linha de comando.
            Process process = Runtime.getRuntime().exec(cmd.toString());
			InputStream in = process.getInputStream();
			String saída = "";

			int c;
			while ((c = in.read()) != -1) {
				saída += ((char) c);
			}

			System.out.println(saída);
			in.close();
		}else{
			throw new IOException("Operation System not supported.");
		}	
	}
	
	/**
	 * Gera arquivo DDF necessário para gerar o .CAB
	 * @param path - Caminho da pasta que contém os arquivos para compactação
	 * @return
	 */
	private static String createDDF(String path){
		// Criamos as instancias do arquivo de configuração para gerar .CAB
		StringBuffer buffer = new StringBuffer();
		buffer.append(".OPTION EXPLICIT").append("\n");
		buffer.append(".Set CabinetNameTemplate=" + path.substring(path.lastIndexOf("\\") + 1) + ".cab").append("\n");
		buffer.append(".Set CompressionType=MSZIP").append("\n");
		buffer.append(".set MaxDiskSize=CDROM").append("\n");
		buffer.append(".Set UniqueFiles=\"ON\"").append("\n");
		buffer.append(".Set Cabinet=on").append("\n");
		buffer.append(".Set CompressionLevel=7").append("\n");
		buffer.append(".Set DiskDirectory1=" + path.substring(0, path.lastIndexOf("\\")+1)).append("\n");
		buffer.append("\n");
		
		String fileDDF = null;
		
		try {
			
			File file = new File(path);
			File[] files = file.listFiles();

			for (File f : files) {
			buffer.append("\"" + f.getAbsolutePath() + "\"\n");
		}
		buffer.append("\n");

		fileDDF = path + "\\" + path.substring(path.lastIndexOf("\\") + 1) + ".ddf";
			writeFile(buffer.toString(), fileDDF);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fileDDF;
		
	}
		
	private static void writeFile(String conteudo, String path)throws Exception{
		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path)));             
			bw.write(conteudo);  
			bw.flush();  
			bw.close();
		}catch (Exception e) {
			throw new Exception("Arquivo não pode ser gravado");
		}
	}
}

OBS: Testado apenas no Windows.

Vlw.

Criado 10 de novembro de 2011
Ultima resposta 21 de nov. de 2011
Respostas 3
Participantes 2