Comment puis-je utiliser Minizip (Zlib)?
Je suis en train de fichiers d'archive pour une application multiplate-forme, et il semble que Minizip (construit sur zlib) est à peu près aussi portable que archiveurs venir.
Lorsque j'essaie d'exécuter le code factice, cependant, je reçois une erreur de système [my executable] has stopped working. Windows can check online for a solution to the problem.
Quelqu'un peut-il m'aider à voir comment utiliser cette bibliothèque? — (il n'y a pas de doc ou tutoriel n'importe où que je peux trouver)
zip_fileinfo zfi;
int main()
{
zipFile zf = zipOpen("myarch.zip",APPEND_STATUS_ADDINZIP);
int ret = zipOpenNewFileInZip(zf,
"myfile.txt",
&zfi,
NULL, 0,
NULL, 0,
"my comment for this interior file",
Z_DEFLATED,
Z_NO_COMPRESSION
);
zipCloseFileInZip(zf);
zipClose(zf, "my comment for exterior file");
return 0;
}
Spécifications: Msys + MinGW, Windows 7, à l'aide zlibwapi.dll de zlib125dll.zip/dll32
OriginalL'auteur JellicleCat | 2012-07-06
Vous devez vous connecter pour publier un commentaire.
Depuis que j'ai découvert à cette question par l'intermédiaire de Google et ça ne contiennent pas complète, code de travail, je suis de la fourniture de certains ici pour les futurs visiteurs.
if (zipWriteInFileInZip(zf, size == 0 ? "" : &buffer[0], size))
peut être écrite commeif (zipWriteInFileInZip(zf, &buffer[0], size))
. 4. Je vous recommande de ne pas utiliser un trait de soulignement préfixe. Je sais que vous êtes à l'aide d'une lettre minuscule après, mais... haussement d'épaulesLes deuxième et troisième points vous soulevez sont mauvais. La taille==0 vérification est de s'assurer que le tampon[0] n'a pas été exécuté sur une longueur égale à zéro. La logique ou l'opération dans l'instruction if veille ensuite à ce que la longueur zéro fichiers sont écrits dans le fichier zip correctement, et, plus tard, ternaire est, une fois de plus, pour s'assurer que le tampon[0] n'est pas appelé sur une longueur égale à zéro. Le code fonctionne correctement et, comme prévu.
C'est marqué que le C, pas du C++.
OriginalL'auteur niemiro
La minizip bibliothèque ne viennent avec des exemples; minizip.c pour la compression et miniunz.c pour la décompression. Les deux sont des utilitaires de ligne de commande qui montrent comment utiliser la bibliothèque. Ils sont un gâchis.
Vous devez également remplir la zfi
zip_fileinfo
. À tout le moins, vous devez initialiser la structure à zéro. zfi contient des informations sur le fichier que vous souhaitez mémoriser à l'aide dezipOpenNewFileInZip
. La structure doit contenir la date et les attributs de "myfile.txt".Je recommande l'utilisation de PKWARE Bureau pour le diagnostic zip questions. Il présente la structure/propriétés des fichiers dans le ZIP et le fichier ZIP lui-même. Quand j'ai ouvert le myarch.zip il m'a dit il y avait des erreurs. J'ai foré vers le bas dans les propriétés du fichier et a constaté que les attributs étaient éteints.
zfi
être initialisé à zéro, sans me le préciser? C'est sur le tas car il est en dehors de toute fonction, non?Ah oui, vous avez raison. J'ai juste mis ton code dans une fonction pour voir si cela a fonctionné.
Votre code doit fonctionner correctement. Je n'ai pas eu tout plantages de Windows. Il pourrait être un problème avec l'utilisation de la DLL. Avez-vous essayé de compiler la bibliothèque zlib?
En compilant le code moi-même l'a fait. +1.
zfi n'est pas sur le tas, qui est allouée dynamiquement de la mémoire tels qu'obtenus par malloc. Sur *NIX, zfi est dans la BSS, ce qui est initialisé à zéro. Sur le plan conceptuel, tous le segment BSS dans un fichier exécutable précise est son adresse de chargement et de la longueur.
OriginalL'auteur Nathan Moinvaziri
La minizip lib est bien documenté. Il suffit d'ouvrir la fermeture éclair.h pour plus de détails.
Je peux vous dire ici, vous peut avoir passé un mauvais paramètre pour zipOpen. (APPEND_STATUS_ADDINZIP nécessite un fichier zip existant!)
Aussi, veuillez vérifier si zipOpen retourne valide zipFile poignée.
APPEND_STATUS_CREATE
. Je ne vois aucune référence à la validité dans le zip.h; pour cela, doit je viens de vérifier si le zipfile estNULL
?En outre, pouvez-vous nous donner un indice sur ce que
extrafield_local
etextrafield_global
sont censés être? Je ne suis pas à trouver un exemple ou une description suffisante.Je n'ai jamais utilisé extrafield_local et extrafield_global avant. Désolé je ne peux pas vous aider. Si votre zip.h ne contient pas de documentation, vous pouvez télécharger zlib code source. Je suis sûr que zip.h dans ce paquet contient une bonne documentation.
Oui, vous pouvez vérifier pour voir si zf est NULL pour déterminer si elle est valide zipFile poignée.
Je suis désolé de dire cela mais minizip est loin d'être quelque chose de bien documentées. C'est l'absolu contraire en fait.
OriginalL'auteur Rango