2013-12-05 3 views
1

Я хочу распаковать большую папку в формате ZIP с вложенными подкаталогами в уже существующей директории. Файлы в папке ZIP могут существовать в распакованном каталоге. Мне нужно сохранить предыдущие файлы только тогда, когда дата этого файла более новая, чем дата файла в ZIP-папке. Если файл в ZIP более новый, я хочу его перезаписать.Папка decompress без перезаписи новых файлов

Есть ли хорошая стратегия для этого? Я уже проверял truezip и zip4j, но я не могу найти вариант (лучший вариант для меня до сих пор изменяет источники zip4j, но это должен быть лучший способ.

PS Если я не объяснил это правильно , пожалуйста, не стесняйтесь спросить английский не является моим родным языком, и я мог бы выразил ничего плохого ..

Благодаря

+0

Почему бы не использовать 'java.util.zip'? Вы полностью контролируете, какие файлы вы извлекаете, где и что делать с существующими файлами. – Joni

+1

Это папка с двумя Gb с разными именами файлов, различная кодировка имен ... Я могу реализовать java.util.zip, но я чувствую, что немного изобретаю колесо, и я могу представить ошибки, которые были решены в любой другой банке уже и, возможно, уменьшили производительность, которую я мог бы получить с проверенной и поддерживаемой банкой. – user3066166

ответ

2

с Zip4j, это то, как это можно сделать:..

import java.io.File; 
import java.util.Date; 
import java.util.List; 

import net.lingala.zip4j.core.ZipFile; 
import net.lingala.zip4j.model.FileHeader; 
import net.lingala.zip4j.util.Zip4jUtil; 


public class ExtractWithoutOverwriting { 

    public static void main(String[] args) { 

     try { 
      String outputPath = "yourOutputPath"; 
      ZipFile zipFile = new ZipFile(new File("yourZipFile.zip")); 
      if (zipFile.isEncrypted()) { 
       zipFile.setPassword("yourPassword".toCharArray()); 
      } 

      @SuppressWarnings("unchecked") 
      List<FileHeader> fileHeaders = zipFile.getFileHeaders(); 

      for (FileHeader fileHeader : fileHeaders) { 
       if (fileHeader.isDirectory()) { 
        File file = new File(outputPath + System.getProperty("file.separator") + fileHeader.getFileName()); 
        file.mkdirs(); 
       } else { 
        if (canWrite(outputPath, fileHeader)) { 
         System.out.println("Writing file: " + fileHeader.getFileName()); 
         zipFile.extractFile(fileHeader, outputPath); 
        } else { 
         System.out.println("Not writing file: " + fileHeader.getFileName()); 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private static boolean canWrite(String outputPath, FileHeader fileHeader) { 
     File file = new File(outputPath + System.getProperty("file.separator") + fileHeader.getFileName()); 
     //time stamps are stored in dos format in a zip file 
     //convert it to java format 
     long lastModifiedFromZip = Zip4jUtil.dosToJavaTme(fileHeader.getLastModFileTime()); 

     //If the file exists, it can be overwritten only if the file in the destination path 
     //is newer than the one in the zip file 
     return !(file.exists() && isLastModifiedDateFromFileNewer(file.lastModified(), lastModifiedFromZip)); 
    } 

    public static boolean isLastModifiedDateFromFileNewer(long lastModifiedFromFile, long lastModifiedFromZip) { 
     Date lastModifiedDateFromFile = new Date(lastModifiedFromFile); 
     Date lastModifiedDateFromZip = new Date(lastModifiedFromZip); 

     return lastModifiedDateFromFile.after(lastModifiedDateFromZip); 
    } 

} 

Что мы здесь делаем:

  1. Создать новый экземпляр ZipFile
  2. Если почтовый файл зашифрован, установить пароль
  3. Loop над всеми файлами в почтовом файле
  4. проверить, существует ли файл с таким именем на выходе путь, и если последнее время изменения этого файла является «более новым», чем последнее в zip-файле. Эта проверка проводится по методу: canWrite()

Этот код не является полностью протестированным, но, надеюсь, он даст вам представление о решении.

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