2

解凍する前に、zipファイルが破損しているか有効なZipファイルかどうかを確認する方法

私のコード`

import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public void unzip() {
        FileInputStream fin = null;
        ZipInputStream zin = null;
        OutputStream fout = null;

    File outputDir = new File(_location);
    File tmp = null;

    try {
        fin = new FileInputStream(_zipFile);
        zin = new ZipInputStream(fin);
        ZipEntry ze = null;
        while ((ze = zin.getNextEntry()) != null) {
            Log.d("Decompress", "Unzipping " + ze.getName());

            if (ze.isDirectory()) {
                dirChecker(ze.getName());
            } else {
                tmp = File.createTempFile( "decomp", ".tmp", outputDir );
                fout = new BufferedOutputStream(new FileOutputStream(tmp));
                DownloadFile.copyStream( zin, fout, _buffer, BUFFER_SIZE );
                zin.closeEntry();
                fout.close();
                fout = null;
                tmp.renameTo( new File(_location + ze.getName()) );
                tmp = null; 
            }
        }
        zin.close();
        zin = null;
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        if ( tmp != null  ) { try { tmp.delete();     } catch (Exception ignore) {;} }
        if ( fout != null ) { try { fout.close();     } catch (Exception ignore) {;} }
        if ( zin != null  ) { try { zin.closeEntry(); } catch (Exception ignore) {;} }
        if ( fin != null  ) { try { fin.close();      } catch (Exception ignore) {;} }
    }
}

`

これは有効なzipファイルで正常に機能しますが、無効なzipファイルは例外をスローせず、何も生成しませんが、解凍する前にzipファイルの有効性を確認する必要があります

4

2 に答える 2

1

zipファイルが破損しているかどうかを確認するのは2つの理由でほとんど役に立たないと思います。

  1. 一部のzipファイルには、zip部分よりも多くのバイトが含まれています。たとえば、自己解凍型アーカイブには実行可能部分がありますが、それでも有効なzipです。
  2. ファイルは、サイズを変更せずに破損する可能性があります。

したがって、破損をチェックする保証された方法のCRCを計算することをお勧めします。

于 2012-05-11T10:51:59.403 に答える
1

Zipファイルは、zipエントリカタログが存在する限り有効です。zipコマンドを実行すると、カタログが存在する限り参照できます。テストに使用されるパラメータは、実際に抽出とCRCチェックを実行します。

できることは、Javaのtemp dir作成機能を使用して、一時フォルダーを抽出してCRCチェックを実行することです。次に、すべて成功した場合は、ファイルを一時ディレクトリから最終的な宛先にコピーして、抽出をコミットします。

于 2012-05-11T11:02:34.420 に答える