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

用户名

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

有一些好的策略可以做到这一点吗?我已经检查过truezip和zip4j,但是找不到该选项(到目前为止,对我来说最好的选择是修改zip4j源,但这应该是一个更好的方法。

附言:如果我没有正确解释这一点,请随时提出。英语不是我的母语,我可能表达了任何错误。

谢谢。

斯里坎特·雷迪·林加拉(Srikanth Reddy Lingala)

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

该代码尚未经过完全测试,但我希望它能为您提供解决方案的想法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解压缩文件夹中的所有.tgz文件并使用不同的命名约定将其写入新文件

解压缩到以存档命名的新文件夹中的存档管理器

更改扩展名、解压缩、删除 zip、合并新文件夹

尝试解压缩文件夹导致错误

jszip可以解压缩文件,但不能解压缩文件夹

Java:使用子文件夹解压缩文件夹

如何使用 Java 压缩和解压缩文件/文件夹

使用Applescript压缩和解压缩文件夹

解压缩压缩文件时,如何仅获取目标文件夹中的完全解压缩文件?

解压缩文件

如何从嵌套文件夹中解压缩文件?

解压缩文件夹中的* .Z文件会返回错误

是否需要解压缩文件夹才能使宏访问其文件?

7z命令:在创建的新文件夹中提取压缩文件

使用python解压缩文件夹和子文件夹中的zip文件

android从zip文件解压缩文件夹并从该文件夹读取内容

Tar解压缩文件夹,如何更改其名称?

StreamSets:如何使用流集解压缩文件夹

在Android Xamarin mono 3.2.6中递归解压缩文件夹

从本地解压缩文件夹安装R软件包

如何在Google Colab中解压缩文件夹?

如何使用符号链接解压缩文件夹

我如何通过在Linux中的给定路径上创建一个新文件夹来解压缩zip文件

在bash中解压缩文件,其中提取的文件夹名称与zip文件名称不匹配

未答复 - 解压缩文件程序不工作

压缩和解压缩文件

解压缩/压缩文件搜索

使用tar -xvzf解压缩会导致文件夹的大小小于压缩文件的大小

将文件扩展名更改为 .zip 并从文档文件夹中解压缩文件