Extrair .zip preservando última data de modificação

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

Valeu.