2009-08-04 8 views
1

Je crée un programme C++ qui va lire le texte brut d'un .docx. Mon plan d'attaque est de renommer le .docx en .zip puis de le décompresser. Je vais ensuite renommer le fichier .xml contenant le texte du document en tant que fichier .txt et l'analyser.Dézipper un répertoire en C++

En ce moment j'ai compris le changement de nom qui était assez facile. Je me bats maintenant avec décompression. Je suis très compétent en C++, mais c'est la première fois que je m'étends aux applications de mots réels et je l'utilise au-delà de la bibliothèque STL. Au début, j'ai essayé de nombreux wrappers pour C++ à partir de la bibliothèque zlib, mais je n'ai réussi à les compiler ni à les utiliser correctement (cela peut être dû au fait que l'environnement se trouve dans Cygwin). Pour cette raison, il semble que je doive utiliser par défaut le code zlib désordonné pour le faire. Mais de toute la documentation et des exemples que je peux trouver il montre seulement zlib étant utilisé pour lire un fichier .zip qui est une compression d'un fichier pas plusieurs fichiers. Je ne sais plus où aller d'ici et, comme je l'ai dit plus tôt, étant complètement nouveau dans le domaine en dehors de STL, je me sens complètement perdu.

Toute aide ou conseil est très appréciée!

Merci, Michael

+2

Vous n'avez pas besoin de renommer les fichiers. Si vous voulez donner un fichier docx à une fonction de décompression dans votre programme, rien ne vous arrête. –

+0

Ah, d'accord. Je n'étais pas sûr de ce qui se passerait alors j'ai pensé que je renoncerais à la renommée juste pour être en sécurité. Merci de l'avoir éclairci. – mcFreid

+0

Des applications de mot réel? Jeu de mots intentionnel? –

Répondre

1

zlib est pour la compression gzip, pas la compression ZIP (see here for details). Par conséquent, il serait peut-être préférable de débourser vers l'utilitaire unzip fourni avec Cygwin et disponible pour lots of platforms.

+0

Je ne suis pas sûr de ce que vous voulez dire par la première question. Je peux bien sûr utiliser le code C si c'est ce que vous sous-entendez. Pourriez-vous fournir plus de détails sur la façon dont j'utiliserais l'exécutable "unzip" dans Cygwin (bien que je préférerais que le code soit portable si cela ne le ferait pas). Aussi, je suis assez sûr que zlib peut faire à la fois la compression/décompression zip et gzip. – mcFreid

+0

J'ai corrigé la première question et ajouté un lien pour montrer que zlib ne peut pas gérer la compression zip. Vous devez utiliser la bibliothèque minizip fournie avec zlib. –

+0

Mike, Merci pour le lien. J'ai mal compris ce que tu voulais dire. Je pensais que vous parliez de fichiers .zip, pas d'archives/dossiers .zip. J'ai aussi essayé info-zip et j'ai eu du mal à le compiler en cygwin. Plus tard, quand je serai à la maison, je publierai les erreurs que je reçois. – mcFreid

1

Je ne pense pas que zlib supporte directement les zips multi-fichiers (cela pourrait être faux), vous devriez donc chercher des alternatives. En passant, vous pouvez également envisager de passer de cygwin à MinGW, sauf si vous avez vraiment besoin de la compatibilité POSIX/UNIX fournie par cygwin.

+0

Si vous utilisez des zips "multi-fichiers", vous voulez dire des fichiers zip contenant plusieurs fichiers, alors il y a minizip. Je ne suis pas tout à fait clair comment minizip se rapporte à zlib (en dehors de cela, il nécessite zlib), mais cela fonctionne. Voir http://www.winimage.com/zLibDll/minizip.html. –

+0

Je suis un peu confus sur la façon d'installer minzip. Du site que vous avez lié il semble qu'il vient maintenant avec zlib, mais je ne le vois pas. Rappelez-vous ici que je suis nouveau à l'aide de bibliothèques supplémentaires avec C++. – mcFreid

1

J'ai eu à faire face à un problème similaire, mais je n'ai pas encore vraiment de solution géniale.

Actuellement, zlib ne supporte pas plusieurs fichiers.

Voir: C/C++ Packing and Compression

+0

Merci pour votre référence. J'ai regardé http://nih.at/libzip/index.html de votre question et il semble qu'il peut fournir ma réponse. Je vais l'essayer dès que possible. – mcFreid

Questions connexes