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.
Este detalhe é muito importante para mim.
Obrigado pela atenção.
Vc conseguiu? Teria algum exemplo de como compactar uma pasta?
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.
package zip;
import java.io.File;
public class TheZipper
{
/*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á descompactado
public boolean unzipFile(String zipFileName,String diretorioDestino)
{
//vai indicar se a descompactação ocorreu com sucesso ou não
Boolean retorno = false;
//variável para armazenar a data de modificação certa
long modificacao = 0;
try
{
byte[] buf = new byte[1024];
ZipInputStream zipinputstream = null;
ZipEntry zipentry;
zipinputstream = new ZipInputStream(new FileInputStream(zipFileName));
zipentry = zipinputstream.getNextEntry();
while (zipentry != null)
{
//para cada entrada a ser extraída
String entryName = zipentry.getName();
//obtem a data de modificação correta e guarda na variável
modificacao = zipentry.getTime();
int n;
FileOutputStream fileoutputstream;
File newFile = new File(entryName);
String directory = newFile.getParent();
if(directory == null)
{
if(newFile.isDirectory())
break;
}
File filem = new File(diretorioDestino+"/"+entryName);
fileoutputstream = new FileOutputStream(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 correta
Boolean yes = filem.setLastModified(modificacao);
if(yes){
System.out.println("é para ter mudado!");
}
zipentry = zipinputstream.getNextEntry();
}//while
zipinputstream.close();
retorno = true;
}
catch (Exception e)
{
e.printStackTrace();
}
return retorno;
}
}
Beleza fera? Diga lá se deu certo.
[]'s