4

zipをダウンロードしてSDカード上のファイルを解凍するアプリケーションがあります。すべて正常に動作しますが、同僚がMac(ライオン)でzipファイルを作成すると、すべてのファイルに

サイズ:-1

crc:-1

圧縮サイズ:-1

SDカードにファイルを書き込めません。両方のzipの内容はまったく同じですが、唯一の違いは、最初にzipした場所です。これは私がファイルを解凍するコードです:

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) Windows7PCで両方のファイルを解凍できます

2)私の同僚は自分のMacで両方のファイルを解凍できます

3)唯一の問題は、AndroidではMACが作成したzipファイルを解凍できないことです...

質問:

Macで圧縮されたzipファイルのサイズがこれらの無効な理由を知っている人はいますか?(Androidの)解凍プロセスにコードがありませんか?

必要に応じて、ここからzipをダウンロードできます。また、出力を表示するための非常に小さなapkもダウンロードできます。

編集:リンクを更新しました

Zipファイル(Macではzip形式)

Zipファイル(Win7のzippen)

Demo.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%

2番目のフィールド(macファイルでは2.1、winファイルでは3.1)を見てください。これは、ファイルが圧縮されたZIPアーカイブ形式のバージョンです。実装は、バージョン2.50以降のjava.util.zipZIPファイル形式のみをサポートします(このStackOverflowを参照)。

Macの[圧縮... ]メニューオプションは、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 に答える