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'ed gZip'ed 文件。

我的猜测是解压缩后文件开头的“垃圾”实际上是 TAR 文件头(我在开头看到一个文件名)。

Tar File Format的更多提示指向 512 字节大小。

gzip 只能压缩单个文件。如果您只是尝试压缩单个文件,则无需先对其进行 tar。

如果您尝试将多个文件压缩为单个存档,则需要使用 TAR 并在解压缩文件后解压缩文件。

只是一个猜测。

克里斯。

于 2009-10-19T14:49:30.680 回答
1

它看起来是一个合理的实现。您是否尝试过使用已知的好工具(即 tar -xzf)解压 TGZ 并查看是否可以正常工作?

于 2009-10-19T14:39:53.167 回答