【问题标题】:Exception when create zipFile in Android with Zip4j: Probably not a zip file or a corrupted zip file使用 Zip4j 在 Android 中创建 zipFile 时出现异常:可能不是 zip 文件或损坏的 zip 文件
【发布时间】:2016-07-19 10:04:50
【问题描述】:

在 android 中使用 zip4j 库生成 zipfile 时遇到问题,代码如下:

try {
    ZipFile zipFile = new ZipFile(dest);
    zipFile.setFileNameCharset("GBK");
    if (srcFile.isDirectory()) {
        zipFile.addFolder(srcFile, parameters);
    } else {
        zipFile.addFile(srcFile, parameters);
    }
} catch (Exception e) {
    e.printStackTrace();
}

我得到了异常消息:

    net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
    at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
    at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
    at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
    at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
    at net.lingala.zip4j.core.ZipFile.addFiles(ZipFile.java:263)
    at net.lingala.zip4j.core.ZipFile.addFile(ZipFile.java:250)
Caused by: java.io.IOException: Negative seek offset
    at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
    at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)

此代码在 Eclipse 中非常适合本地文件,但在 Android 中效果不佳,我很确定目标 .zip 路径是正确的,并且 zip4j 库版本是 1.3.2。

谁能给我任何建议?

【问题讨论】:

    标签: java android exception zip zip4j


    【解决方案1】:

    我遇到了非常相似的堆栈跟踪。但是,我在桌面版 1.3.2 中使用 java 和 zip4j。我不确定我的答案与 android 有什么关系,但就是这样。

    我的堆栈跟踪

    Caused by: net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
            at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
            at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
            at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
            at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
            at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:343)
            at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:330)
    Caused by: java.io.IOException: Negative seek offset
            at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
            at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
            at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
    

    我是这样使用 zip4j 的

    Path destination = Files.createTempFile("export", ".zip");
    ZipFile zip = new ZipFile(destination.toFile());
    

    为了解决我改成的问题

    File destination = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
    ZipFile zip = new ZipFile(destination);
    

    不同之处在于 Files.createTempFile() 创建空文件并且该文件必须搞砸ZipFile 的构造函数。当我以未占用的路径通过File 时,问题就消失了。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,因为我使用了 AES 加密但没有设置参数 AES 数据密钥。

      【讨论】:

      • edit您的帖子并将实际代码显示为文本而不是屏幕截图。其他人无法从您的图像中复制和粘贴。 See here 了解详情。谢谢。
      【解决方案3】:

      此操作的工作代码以及受密码保护的 zip 是:

      File dbFile = new File(ctx.getExternalFilesDir("") + File.separator +
                              AppConstants.DB_PATH + File.separator + AppConstants.DB_NAME);
      zipName = AppConstants.DB_NAME + "-" + getCurrentDateTime() + ".zip";
      ZipFile zipFile = new ZipFile(folderPath + File.separator + zipName);
      
      ZipParameters parameters = new ZipParameters();
      parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
      parameters.setEncryptFiles(true);
      parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
      parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
      parameters.setPassword(AppUtil.decodeStr(AppConstants.DB_PASSWORD));
      zipFile.addFile(dbFile, parameters);
      

      但是由于以下原因,问题仍然可能出现:

      • 添加到zipFile时源文件不存在,
      • 应用无权读取源文件,
      • 目标 zip 文件可能包含特殊符号或空格 文件名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多