iPhone Décompressez le code
Vraiment coincé sur le fait d'essayer d'écrire du code pour décompresser un fichier ou un répertoire sur l'iPhone.
Ci-dessous est un exemple de code que j'utilise pour essayer de le décompresser un fichier texte simple.
Il se décompresse le fichier, mais son corrompue.
(void)loadView {
NSString *DOCUMENTS_FOLDER = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *path = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"sample.zip"];
NSString *unzipeddest = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"test.txt"];
gzFile file = gzopen([path UTF8String], "rb");
FILE *dest = fopen([unzipeddest UTF8String], "w");
unsigned char buffer[CHUNK];
int uncompressedLength = gzread(file, buffer, CHUNK);
if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength || ferror(dest)) {
NSLog(@"error writing data");
}
else{
}
fclose(dest);
gzclose(file);
}
Vous devez vous connecter pour publier un commentaire.
A "sample.zip" vraiment été créé à l'aide de gZip? L' .extension zip est généralement utilisé pour les archives créées par WinZip. Ceux-ci peuvent également être décompressé à l'aide de la librairie zLib, mais vous auriez à analyser l'en-tête et d'utiliser d'autres routines.
Pour vérifier, avoir un regard sur les deux premiers octets du fichier. Si c'est 'PK', c'est WinZip, si c'est 0x1F8B, c'est gZip.
Parce que c'est l'iPhone spécifiques, ont un oeil à ce SDK de l'iPhone forum de discussion où miniZip est mentionné. Il semble que ce peut gérer WinZip fichiers.
Mais si c'est vraiment un fichier WinZip, vous devriez jeter un oeil à la WinZip spécification et essayer d'analyser le fichier vous-même. Essentiellement, il devrait être l'analyse de certaines valeurs d'en-tête, cherchant le flux compressé position et avec zLib routines pour le décompresser.
Je voulais une solution facile et n'ai pas trouvé celui que j'ai aimé ici, j'ai donc modifié une bibliothèque pour faire ce que je voulais. Vous pouvez trouver SSZipArchive utile. (Il peut également créer des fichiers zip par le chemin.)
Utilisation:
Ce code a bien fonctionné pour moi pour gzip:
la base de données a été préparé comme ceci:
gzip foo.db
la clé était de boucler sur la gzread(). L'exemple ci-dessus ne lit que le premier MORCEAU octets.
D'ailleurs, je peux décompresser 33MB dans 130 MO en 77 secondes ou environ 1,7 MO non compressé/seconde.
Ce code va décompresser tout .le fichier zip dans votre application répertoire de documents et d'obtenir des fichiers de ressources de l'application.
Il est vraiment difficile pour décompresser n'importe quel fichier zip. C'est un complexe de format de fichier, et il y a potentiellement beaucoup de différentes routines de compression qui pourrait avoir été utilisé en interne pour le fichier. Info-ZIP a quelques librement licencable le code pour le faire (http://www.info-zip.org/UnZip.html) qui peuvent fonctionner sur l'iPhone avec certains de piratage, mais l'API est franchement horrible - elle consiste à faire passer arguments de ligne de commande à un faux "principal" qui simule le fonctionnement de Décompresser (pour être juste, c'est parce que leur code n'a jamais été conçu pour être utilisé comme cela, en premier lieu, la bibliothèque de la fonctionnalité a été boulonné par la suite).
Si vous avez tout le contrôle de l'endroit où les fichiers que vous essayez de décompresser viennent, je très vous recommandons d'utiliser un autre système de compression au lieu de ZIP. C'est de la souplesse et de l'ubiquité le rendent idéal pour le passage des archives de fichiers de personne à personne, mais c'est très difficile à automatiser.
zlib n'est pas destiné à ouvrir .les fichiers zip, mais vous avez de la chance: zlib du répertoire contrib comprend minizip, qui est capable d'utiliser la librairie zlib ouvrir .les fichiers zip.
Il peut ne pas être fourni dans le SDK, mais vous pouvez probablement utiliser la version intégrée de zlib l'utiliser. Récupérer une copie de la zlib source et de regarder dans contrib/minizip.
Je n'ai pas utilisé l'iPhone, mais vous voudrez peut-être chercher à GZIP, ce qui est très portable open source zip bibliothèque disponible pour de nombreuses plates-formes.
J'ai eu la chance de tester ce sur le simulateur d'iPhone:
Il semble plus facile que de bricoler avec zlib...