2

圧縮解除してファイルに書き込みたい .tgz ファイルがバンドルにいくつかあります。私はそれを機能させました-一種の。問題は、書き込まれたファイルの前に 512 バイトのがらくたデータが含まれていることですが、それ以外は、ファイルは正常に解凍されています。

代替テキスト
(ソース: pici.se )

私はがらくたをしたくありません。常に 512 バイトである場合、それらを飛ばして他を書き込むのはもちろん簡単です。でも、いつもそうですか?そもそもなぜそれらのバイトがそこにあるのかわからない場合、そのようなことをするのは危険です。

    gzFile f = gzopen ([[[NSBundle mainBundle] pathForResource:file ofType:@"tgz"] cStringUsingEncoding:NSASCIIStringEncoding], [@"rb" cStringUsingEncoding:NSASCIIStringEncoding]); 
    unsigned int length = 1024*1024;
    void *buffer = malloc(length);
    NSMutableData *data = [NSMutableData new];

    while (true)
    {   
        int read = gzread(f, buffer, length);

        if (read > 0)
        {
            [data appendBytes:buffer length:read];
        }
        else if (read == 0)
            break;
        else if (read == -1)
        {
            throw [NSException exceptionWithName:@"Decompression failed" reason:@"read = -1" userInfo:nil];
        }
        else
        {
            throw [NSException exceptionWithName:@"Unexpected state from zlib" reason:@"read < -1" userInfo:nil];
        }
    }

    int writeSucceeded = [data writeToFile:file automatically:YES];

    free(buffer);
    [data release];

    if (!writeSucceeded)
        throw [NSException exceptionWithName:@"Write failed" reason:@"writeSucceeded != true" userInfo:nil];
4

2 に答える 2

6

投稿したコードに基づくと、gzipのみを使用してTar'edgZip'edファイルを読み取ろうとしているようです。

私の推測では、解凍後のファイルの先頭にある「ジャンク」は、実際にはTARファイルヘッダーです(先頭にファイル名が表示されています)。

Tar File Formatのその他のヒントは、512バイトサイズを示しています。

gzipで圧縮できるのは1つのファイルのみです。単一のファイルのみを圧縮しようとしている場合は、最初にそれをtarする必要はありません。

複数のファイルを単一のアーカイブとして圧縮しようとしている場合は、TARを使用して、ファイルを解凍した後にファイルを解凍する必要があります。

ただの推測。

クリス。

于 2009-10-19T14:49:30.680 に答える
1

合理的な実装のように見えます。既知の適切なツール (つまり、tar -xzf) を使用して TGZ を解凍し、それが正常に機能するかどうかを確認しましたか?

于 2009-10-19T14:39:53.167 に答える