2009-10-19 4 views
2

내 번들에 파일 압축을 풀고 쓰기를 원하는 두 개의 .tgz 파일이있다. 나는 그것을 작동 시켰어. 일종의. 문제는 작성된 파일이 앞에 512 바이트의 쓰레기 데이터를 가져 오지만 그 이외의 파일은 압축되지 않은 것입니다.zlib iPhone - 파일이 허튼 소리를 낸다

alt text http://pici.se/pictures/acbdwGCvX.gif

나는 쓰레기를 원하지 않는다. 항상 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]; 
+0

tgz에서 추가 한 헤더 정보 일 수 있습니까? – Jasarien

답변

6

게시 한 코드에 따르면 gzip을 사용하여 Tar'ed gZip'ed 파일을 읽는 것 같습니다.

내 생각 엔 압축 해제 후 파일의 시작 부분에있는 "정크"가 TAR 파일 헤더 (실제로 파일 이름이 시작 부분에 있음)입니다.

Tar File Format에서 더 많은 힌트가 512 바이트 크기를 가리 킵니다.

gzip은 하나의 파일 만 압축 할 수 있습니다. 단일 파일 만 압축하려는 경우 먼저 압축 할 필요가 없습니다.

여러 파일을 압축하려는 경우 단일 아카이브로 압축을 풀었 으면 TAR을 사용하고 파일을 압축 해제해야합니다.

그냥 추측하십시오.

chris.

+0

이것은 문제의 출처와 같습니다. 파일은 개별적으로 압축됩니다. 어떻게 "gz"할 수 있습니까? – quano

+0

답 : gzip -c original> 출력 – quano

+0

감사합니다. 실제로이 문제가있었습니다. – quano

1

합리적인 구현처럼 보입니다. 알려진 도구 (예 : tar -xzf)를 사용하여 TGZ의 압축을 풀어보고 시도했는지 확인 했습니까?

+0

나는 지금 시도했다. 그게 효과가 있었어. 그것은 쓰레기가되지 않습니다. – quano