Extrair .zip preservando última data de modificação
3 respostas
D
Dyego_Sutil
Olá pessoal.
Basicamente eu preciso extrair um arquivo .zip com java mas mantendo a data de última modificação.
Por exemplo, eu tenho o arquivo file.exe. Zipo ele com o windows mesmo, gerando o arquivo file.zip. Então, quando extraio ele usando java.util.zip ou commons-compress o arquivo perde a data da última modificação.
Vc conseguiu? Teria algum exemplo de como compactar uma pasta?
D
Dyego_Sutil
Com a classe que segue fiz testes somente com arquivos executáveis, não tenho certeza se vai funcionar com pasta também. Mais de qualquer forma já serve de base para você.
Basicamente é armazenado em uma variável a data de modificação correta do arquivo(zipEntry) antes de descompactar. Depois que é extraído, como a data torna-se a atual, é usado o setLastModifield() para colocar a data correta que foi guardada antes.
packagezip;importjava.io.File;publicclassTheZipper{/*public static void main(String[] args) { if(new TheZipper().unzipFile("D:\\temp\\WMALog.zip", "D:\\temp")) { System.out.println("unzipou!"); } else { System.out.println("Não unzipou!"); } }*///Primeiro parâmetro é o arquivo zip, e o segundo é o diretório onde será descompactadopublicbooleanunzipFile(StringzipFileName,StringdiretorioDestino){//vai indicar se a descompactação ocorreu com sucesso ou nãoBooleanretorno=false;//variável para armazenar a data de modificação certalongmodificacao=0;try{byte[]buf=newbyte[1024];ZipInputStreamzipinputstream=null;ZipEntryzipentry;zipinputstream=newZipInputStream(newFileInputStream(zipFileName));zipentry=zipinputstream.getNextEntry();while(zipentry!=null){//para cada entrada a ser extraídaStringentryName=zipentry.getName();//obtem a data de modificação correta e guarda na variávelmodificacao=zipentry.getTime();intn;FileOutputStreamfileoutputstream;FilenewFile=newFile(entryName);Stringdirectory=newFile.getParent();if(directory==null){if(newFile.isDirectory())break;}Filefilem=newFile(diretorioDestino+"/"+entryName);fileoutputstream=newFileOutputStream(diretorioDestino+"/"+entryName);while((n=zipinputstream.read(buf,0,1024))>-1)fileoutputstream.write(buf,0,n);fileoutputstream.close();zipinputstream.closeEntry();//Colocando agora a data de modificação corretaBooleanyes=filem.setLastModified(modificacao);if(yes){System.out.println("é para ter mudado!");}zipentry=zipinputstream.getNextEntry();}//whilezipinputstream.close();retorno=true;}catch(Exceptione){e.printStackTrace();}returnretorno;}}