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.
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 */importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.io.InputStream;publicclassCABZip{/** * 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 */publicstaticvoidcreateCabFile(Stringpath)throwsIOException{Filef=newFile(path);if(!f.exists())f.mkdir();Stringddf=createDDF(f.getAbsolutePath());/* Deve ter o arquivo makecab instalado no C:\Windows\System32 */if(System.getProperty("os.name").contains("Windows")){StringBuffercmd=newStringBuffer();cmd.append("MAKECAB").append(" /f ").append("\""+ddf+"\"");Runtime.getRuntime().exec(cmd.toString());// Executa a compactação por linha de comando.Processprocess=Runtime.getRuntime().exec(cmd.toString());InputStreamin=process.getInputStream();Stringsaída="";intc;while((c=in.read())!=-1){saída+=((char)c);}System.out.println(saída);in.close();}else{thrownewIOException("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 */privatestaticStringcreateDDF(Stringpath){// Criamos as instancias do arquivo de configuração para gerar .CABStringBufferbuffer=newStringBuffer();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");StringfileDDF=null;try{Filefile=newFile(path);File[]files=file.listFiles();for(Filef:files){buffer.append("\""+f.getAbsolutePath()+"\"\n");}buffer.append("\n");fileDDF=path+"\\"+path.substring(path.lastIndexOf("\\")+1)+".ddf";writeFile(buffer.toString(),fileDDF);}catch(Exceptione){e.printStackTrace();}returnfileDDF;}privatestaticvoidwriteFile(Stringconteudo,Stringpath)throwsException{try{BufferedWriterbw=newBufferedWriter(newFileWriter(newFile(path)));bw.write(conteudo);bw.flush();bw.close();}catch(Exceptione){thrownewException("Arquivo não pode ser gravado");}}}