2012-06-11 3 views
2

Проприетарная программа, в которой я работаю с застежками-молниями и извлекает определенные файлы, не изменяя измененную дату файлов при распаковке. Я также создаю свой собственный инструмент zip и извлечения, основанный на исходном коде в нашей программе, но когда я разархивирую файлы, измененная дата всех файлов с zip-файлами отображается с временем распаковки &. Вот код для моего извлечения:Java: Сохранение заархивированных файлов Дата изменения

public static int unzipFiles(File zipFile, File extractDir) throws Exception 
{ 
     int totalFileCount = 0; 
     String zipFilePath = zipFile.getPath(); 

     System.out.println("Zip File Path: " + zipFilePath); 

     ZipFile zfile = new ZipFile(zipFile); 
     System.out.println("Size of ZipFile: "+zfile.size()); 

     Enumeration<? extends ZipEntry> entries = zfile.entries(); 

     while (entries.hasMoreElements()) 
     { 
      ZipEntry entry = entries.nextElement(); 
      System.out.println("ZipEntry File: " + entry.getName()); 
      File file = new File(extractDir, entry.getName()); 
      if (entry.isDirectory()) 
      { 
      System.out.println("Creating Directory"); 
      file.mkdirs(); 
      } 
      else 
      { 
      file.getParentFile().mkdirs(); 
      InputStream in = zfile.getInputStream(entry); 
      try 
      { 
       copy(in, file); 
      } 
      finally 
      { 
       in.close(); 
      } 
      } 
      totalFileCount++; 
     } 
     return totalFileCount; 
     } 

private static void copy(InputStream in, OutputStream out) throws IOException 

{

byte[] buffer = new byte[1024]; 
    System.out.println("InputStream/OutputStram copy"); 
    while (true) 
    { 
    int readCount = in.read(buffer); 
    if (readCount < 0) 
    { 
     break; 
    } 
    out.write(buffer, 0, readCount); 
    } 
} 

Я уверен, что есть лучший способ сделать это, кроме делать InputStream/OutputStream копию. Я уверен, что это преступник, так как извлечение с помощью winRAR не меняет дату с файлами, которые я закрепил.

+0

В Java единственный простой способ скопировать файл - это открыть потоки и читать их, что приводит к техническому изменению файла при копировании. Это означает, что вам нужно вручную установить последнее время модификации. См. Ответ TimK. – Vulcan

+0

'ZipEntry entry = entries.nextElement(); System.out.println ("ZipEntry File:" + entry.getName()); Файл файла = новый Файл (extractDir, entry.getName()); file.setLastModified (entry.getTime()); ' –

+0

@TimK приведенный выше код должен работать тогда, правильно? –

ответ

7

Используйте ZipEntry.getTime, чтобы получить последнее модифицированное время и File.setLastModified, чтобы установить его в файл после того, как вы закончите его копирование.

Смежные вопросы