1

我想解压缩一个 ZIP 格式的大文件夹,其中嵌套的子目录位于一个已经存在的目录中。ZIP 文件夹内的文件可以存在于解压后的目录中。仅当该文件的日期比 ZIP 文件夹中文件的日期新时,我才需要保留以前的文件。如果 ZIP 中的文件较新,那么我想覆盖它。

这样做有什么好的策略吗?我已经检查了 truezip 和 zip4j,但我找不到选项(目前对我来说最好的选择是修改 zip4j 源,但它应该是更好的方法。

PS如果我没有正确解释这一点,请随时提问。英语不是我的母语,我本可以表达任何错误..

谢谢。

4

1 回答 1

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()

这段代码没有经过完全测试,但我希望它能给你一个解决方案的想法。

于 2013-12-05T12:16:52.970 回答