解压缩文件夹而不覆盖新文件

时间:2013-12-05 10:56:52

标签: java compression zip truezip zip4j

我想在已存在的目录中使用嵌套子目录解压缩ZIP格式的大文件夹。 ZIP文件夹中的文件可以存在于解压缩目录中。只有当该文件的日期比ZIP文件夹中的文件日期更新时,我才需要保留以前的文件。如果ZIP中的文件较新,那么我想覆盖它。

这样做有一些好策略吗?我已经检查了truezip和zip4j,但我找不到该选项(迄今为止我最好的选择是修改zip4j源码,但它应该是更好的方法。

P.S。如果我没有正确解释,请随时询问。英语不是我的母语,我可能表达了任何错误......

感谢。

1 个答案:

答案 0 :(得分:3)

使用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. 如果zip文件已加密,请设置密码
  3. 遍历zip文件中的所有文件
  4. 检查输出路径中是否存在具有此名称的文件,以及此文件的上次修改时间是否比zip文件中的文件“更新”。此检查在方法中完成:canWrite()
  5. 此代码未经过完整测试,但我希望它能让您了解解决方案。