4

我有一个应用程序,它下载一个 zip 文件并解压缩我 SDCard 上的文件。一切正常,但是当我的同事在他的 Mac(狮子)上创建 zip 文件时,我的所有文件都有

尺寸:-1

CRC:-1

压缩大小:-1

而且我无法将文件写入我的 SD 卡。两个拉链具有完全相同的内容,唯一的区别是它们最初压缩的位置。这是我解压缩文件的代码:

public class UnzipTask extends AsyncTask<String, Integer, Void> {

    private static final String TAG = UnzipTask.class.getSimpleName();


    private String mDestLocation;
    private ZipListener mListener;
    private Context mCtx;

    private int mCallbackId;

    public UnzipTask(Context context, ZipListener listener, File dir)
    {
        mCtx = context;
        mListener = listener;
        mDestLocation = dir.getAbsolutePath() + "/";

    }

    public void setId(int id)
    {
        mCallbackId = id;
    }

    @Override
    protected Void doInBackground(String... arg0) {


        try {

            String file = arg0[0];
            InputStream is = mCtx.getAssets().open(file);
            unzipFile(is);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * Private function that ensures a directory exist
     * @param dir
     */
    private void _dirChecker(String dir) {
        File f = new File(mDestLocation + dir);

        if (!f.isDirectory()) {
            f.mkdirs();
            }
    }

    private void unzipFile(InputStream input) throws Exception {

        ZipInputStream zin = new ZipInputStream(input);
        ZipEntry ze = null;

        while ((ze = zin.getNextEntry()) != null) {

            Log.v(TAG, "Unzipping " + ze.getName());

            if(mListener != null)
            {
                mListener.onUnzipped(mCallbackId, ze.getName(), ze.g   etSize(), ze.getCrc(), ze.getCompressedSize());
                }

            if (ze.isDirectory()) {
                _dirChecker(ze.getName());
            } else if (ze.getCompressedSize() > 0 && ze.getSize() > 0 && ze.getCrc() != 0.0) {
                // If size=-1 -> writing to disk fails

                String fileOutput = mDestLocation + ze.getName();

                FileOutputStream fout = new FileOutputStream(fileOutput);
                int read = 0;

                byte[] buffer = new byte[(int) ze.getSize()];

                while ((read = zin.read(buffer)) >= 0) {
                    fout.write(buffer, 0, read);
                }

                zin.closeEntry();
                fout.close();
                } else {
                Log.v(TAG, "Skipping entry" + ze.getName());
            } 
            }
        }

        zin.close();
    }

}

一些笔记

1)我可以在我的 Windows 7 电脑上解压缩这两个文件

2)我的同事可以在他的 Mac 上解压缩这两个文件

3)唯一的问题是,在 Android 上,我无法解压缩 MAC 创建的 zip 文件...

问题:

有谁知道为什么在 Mac 上压缩的 zip 文件有这些无效的大小?我的解压过程(在 Android 上)是否缺少一些代码?

如果需要,您可以在此处下载 zip,以及一个非常小的 apk 来显示输出:

编辑:更新了链接

压缩文件(在 Mac 上压缩)

压缩文件(Win7 上的压缩文件)

演示.apk

4

2 回答 2

5

该问题与版本有关。让我从我的 Mac (10.8) 的一些输出开始:

~ $ zipinfo -m test_mac.zip 
Archive: test_mac.zip   1694 bytes   8 files
drwxr-xr-x  2.1 unx        0 bx  0% stor 10-Aug-12 01:11 test_win/
-rwxr-xr-x  2.1 unx       46 bX 20% defN 10-Aug-12 01:11 test_win/index.html
drwxrwxr-x  2.1 unx        0 bx  0% stor 10-Aug-12 01:12 __MACOSX/
drwxrwxr-x  2.1 unx        0 bx  0% stor 10-Aug-12 01:12 __MACOSX/test_win/
-rw-r--r--  2.1 unx      211 bX 37% defN 10-Aug-12 01:11 __MACOSX/test_win/._index.html
-rwxr-xr-x  2.1 unx        9 bX-21% defN 10-Aug-12 01:10 test_win/version.txt
-rw-r--r--  2.1 unx      211 bX 37% defN 10-Aug-12 01:10 __MACOSX/test_win/._version.txt
-rw-r--r--  2.1 unx      211 bX 37% defN 10-Aug-12 01:11 __MACOSX/._test_win
8 files, 688 bytes uncompressed, 450 bytes compressed:  34.6%
~ $ zipinfo -m test_win.zip 
Archive: test_win.zip   1678 bytes   8 files
drwx---     3.1 fat        0 bx  0% stor 10-Aug-12 09:11 test_win/
-rw-a--     3.1 fat       46 bx 20% defN 10-Aug-12 09:11 test_win/index.html
-rw-a--     3.1 fat        9 bx-21% defN 10-Aug-12 09:10 test_win/version.txt
drwx---     3.1 fat        0 bx  0% stor 10-Aug-12 09:12 __MACOSX/
-rw-a--     3.1 fat      211 bx 37% defN 10-Aug-12 09:11 __MACOSX/._test_win
drwx---     3.1 fat        0 bx  0% stor 10-Aug-12 09:12 __MACOSX/test_win/
-rw-a--     3.1 fat      211 bx 37% defN 10-Aug-12 09:11 __MACOSX/test_win/._index.html
-rw-a--     3.1 fat      211 bx 37% defN 10-Aug-12 09:10 __MACOSX/test_win/._version.txt
8 files, 688 bytes uncompressed, 450 bytes compressed:  34.6%

查看第二个字段(mac 文件中的 2.1 和 win 文件中的 3.1)。这是压缩文件的 ZIP 存档格式版本。该java.util.zip实现仅支持 2.50 及更高版本的 ZIP 文件格式(请参阅此StackOverflow)。

Mac 的Compress ...菜单选项使用低于 Java 实现支持的版本(2.1 仍在 10.8 中使用)。

告诉您的同事改用命令行工具(例如zip -r myfile.zip directory_to_compress/),您应该得到一个 Android 应用程序可以膨胀的输出。

于 2012-08-13T20:38:37.860 回答
0

这些文件非常不同......很难找到重要的差异。在此处输入图像描述

于 2012-08-13T19:57:46.253 回答