2009-10-19 5 views
2

J'ai un couple de fichiers .tgz dans mon paquet que je veux décompresser et écrire dans un fichier. Je l'ai fonctionné - en quelque sorte. Le problème est que le fichier écrit obtient 512 octets de données de merde en face de lui, mais à part cela, le fichier est décompressé avec succès.zlib iPhone - les fichiers commencent par faire la connerie

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

Je ne veux pas la merde. Si c'est toujours 512 octets, il est bien sûr facile de passer ces derniers et d'écrire les autres. Mais est-ce toujours comme ça? Risqué de faire quelque chose comme ça si l'on ne sait pas pourquoi ces octets sont là en premier lieu.

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

Pourrait-il y avoir une sorte d'info d'en-tête ajoutée par le tgz? – Jasarien

Répondre

6

D'après le code que vous avez posté, il semble que vous essayiez de lire un fichier Tar'ed gZip'ed en utilisant gzip seulement. Je pense que le "junk" au début du fichier après la décompression est en fait l'en-tête du fichier TAR (je vois un nom de fichier là au début).

Plus d'indices à Tar File Format pointent vers la taille de 512 octets. Gzip ne peut compresser qu'un seul fichier. Si vous essayez seulement de compresser un seul fichier, vous n'avez pas besoin de le taper en premier.

Si vous essayez de compresser plusieurs fichiers et en une seule archive, vous devrez utiliser TAR et décompresser les fichiers après les avoir décompressés.

Juste une supposition.

chris.

+0

Cela semble être la source du problème. Les fichiers sont tar: ed individuellement. Comment les "gz" tu seulement? – quano

+0

Réponse: gzip -c original> sortie – quano

+0

Merci, c'était effectivement le problème. – quano

1

Cela ressemble à une implémentation raisonnable. Avez-vous essayé de décompresser le TGZ avec un bon outil connu (c'est-à-dire tar -xzf) et de voir si cela fonctionne?

+0

J'ai essayé maintenant. Ça a marché. Ça ne fait pas de la merde. – quano

Questions connexes