Bonjour tout le monde !
Bon voilà, dans le programme que je développe, j'aurais besoin de décompresser des fichier zip et je crois avoir lu quelques part que on pouvait le faire avec irrlicht.
Le seul problème, c'est que évidemment, quand je cherche "irrlicht zip" sur Google ou sur ce forum, je ne tombe que sur des articles ou des post qui parlent des sorties d'irrlicht : "irrlicht-1.7.zip", etc... A moins que je me trompe et qu'on ne puisse pas faire ça avec irrlicht ??? oO
Donc je n'arrive pas à trouver les pages de docs, ou des tutoriels, donc si quelqu'un avait quelques liens, ça serait sympa
D'avance, merci !
Dernière modification par xapantu (11-02-2010 14:57:58)
Hors ligne
Salut,
Pour ma part, je n'ai pas encore essayé, mais je suis convaincu que c'est effectivement possible.
Je pense qu'il faut creuser du coté de l'interface IArchiveFile, qui permet d'ouvrir et lire le contenu d'archives.
http://irrlicht.sourceforge.net/docu/cl … chive.html
En utilisant "getFileList", tu dois pouvoir récupérer ce qu'il y a dans ton archive, puis avec "createAndOpenFile" choisir un fichier de cette liste pour l'ouvrir. (Enfin je pense que c'est comme ça que ça marche)
J'espère que ceci pourra t'aider, et si tu t'en sors, un petit retour avec un bout de code serait le bienvenue.
Hors ligne
Merci, je viens de regarder mais je bloque là :
IFileArchive * zipfile;
IReadFile* file = zipfile->createAndOpenFile("zip.zip");
(sachant que le fichier zip.zip existe bien)
Il m'affiche une erreur de segmentation.
J'ai du louper un truc évident (c'est la première fois que je fait un vrai truc en c++ ) mais quoi ? Je crois que ça vient de l'argument mais je n'arrive pas à comprendre ce qu'il faut mettre à la place...
Dernière modification par xapantu (11-02-2010 17:03:31)
Hors ligne
J'ai trouvé ça : http://www.example-code.com/vcpp/zip.asp
C'est pas du Irrlicht mais une bonne lib de manupulition de fichier zip.
Hors ligne
En fait ça serait pour un programme sur plusieurs système d'exploitation et j'aimerais limiter les problèmes de dépendances, donc utiliser seulment irrlicht ça serait plus simple .
Dernière modification par xapantu (11-02-2010 17:49:10)
Hors ligne
Est-ce-que tes zip ont un mot de pass ?
Hors ligne
Non, ce sont de simple zip (enfin je vais quand même essayer avec d'autres pour voir) mais je n'arrive pas à comprendre ce que signifie :
createAndOpenFile (const path &filename)
(extrait de la doc d'irrlicht)
et moi j'utilise :
IFileArchive * zipfile; IReadFile* file = zipfile->createAndOpenFile("zip.zip");
Je pense que le problème vient de là. Quelqu'un à une idée ?
Hors ligne
Ton pointeur sur IFileArchive est null. D'où le SEGFAULT.
Je pense qu'il doit falloir utiliser le File System d'abord pour ajouter des archives (addZipFileArchive) que tu récupère ensuite avec getFileArchive, et ensuite tu pourra récupérer la liste des objets dans ton archive.
Dernière modification par Hawk (11-02-2010 19:16:40)
Hors ligne
Super, merci beaucoup
Je vais essayer de finir ça en décompressant les fichiers, je n'avais pas du tout compris le principe de la classe IFileArchive
Hors ligne
T'as essayé comme ça :
device->getFileSystem()->addZipFileArchive("file.zip");
après normalement tu peut faire ça si ton zip contient un fichier comme une texture :
driver->getTexture("texture_contenu_dans_le_zip.bmp")
Évidement ça marche avec tout les types de fichier (pas que les textures).
createAndOpenFile crée un nouveau fichier.
Dernière modification par Ilovechocolat (11-02-2010 20:35:52)
Hors ligne
Ok, merci
Et quelqu'un sait comment on recopie un fichier qui est chargé dans un IReadFile parce que là que ce soit dans l'exemple de Ilovechocolat ou de Hawk, je n'arrive pas à recopier le fichier dans un dossier externe après
Merci beaucoup pour tout !
Dernière modification par xapantu (11-02-2010 21:08:03)
Hors ligne
Je crois qu'il faut utiliser la méthode read de IReadFile et écrire le contenu dans un IWriteFile avec write mais je ne parviens pas à compre,dre comment marche les buffer (et surtout comment les initialiser), j'ai essayé avec un tableau de char mais ça ne marche pas
Quelqu'un a une idée ?
Et encore merci pour l'aide !
Hors ligne
Les buffer c'est pas les données sur le maillage d'un mesh ? La définition de google c'est "tampon" mais ça m'étonnerais que ce soit ça.
Sino si c'est pour créer un fichier, t'a des fonctions C et des class C++ dans la lib standart pour faire ça.
Dernière modification par Ilovechocolat (12-02-2010 12:43:44)
Hors ligne
Non, ce n'est pas que de données sur un mesh, par exemple :
et il y a l'équivalent avec write :
http://irrlicht.sourceforge.net/docu/cl … _file.html
et donc je pense que en écrivant avec write les données récupérés avec read, on doit pouvoir dupliquer un fichier mais je ne sais pas comment utilisant ces buffer
Dernière modification par xapantu (12-02-2010 13:08:42)
Hors ligne
Je viens de trouver ça : http://irrlicht.sourceforge.net/phpBB2/ … iwritefile je vais essayer
Hors ligne
Bon bah c'est bon ça marche :
s32 IFileSystem_copyFileToFile(IWriteFile* dst, IReadFile* src)
{
char buf[1024];
const s32 sz = sizeof(buf) / sizeof(*buf);
s32 r, rx = src->getSize();
for (r = 0; r < rx; /**/)
{
s32 w, wx = src->read(buf, sz);
for (w = 0; w < wx; /**/)
{
s32 n = dst->write(buf + w, wx - w);
if (n < 0)
return -1;
else
w += n;
}
r += w;
}
return r;
}
dans une fonction :
IrrlichtDevice * device = irr_driver->getDevice(); IFileSystem* pfs = device->getFileSystem(); //Ajoute ton archive pfs->addZipFileArchive("zip.zip"); //Attention au chemin //Récupère ton archive IFileArchive * fs = pfs->getFileArchive(0); IReadFile* srcFile = pfs->createAndOpenFile("fileOnZip"); IWriteFile* dstFile = pfs->createAndWriteFile("fileOnDisk.txt"); if (IFileSystem_copyFileToFile(dstFile, srcFile) < 0) ; // error srcFile->drop(); dstFile->drop();
Merci à tous
Dernière modification par xapantu (12-02-2010 13:25:56)
Hors ligne
Un buffer, c'est un terme très générique qui peut désigner beaucoup de choses. En gros, c'est juste un tableau de données. (version très simplifiée) Tampon, c'est effectivement le nom qu'on donne aux buffers informatiques en français, mais bon, je trouve ça moche, j'appelle ça des buffers.
http://fr.wikipedia.org/wiki/M%C3%A9moire_tampon
CF le dernier paragraphe.
Je pense qu'un truc qui pourrait marcher ce serait :
Je ne suis pas sûr à 100%, mais je pense que ce code va chercher le fichier "monfichierlu.txt" dans ton archive, et va l'écrire dans le répertoire "chemin", sous le nom "monfichierecrit.txt". Evidemment, tu peux garder le même si tu veux. Après pour faire ça pour tous les fichiers de ton zip, avec une boucle for, et les index des fichiers, ça devrait se faire.
Hors ligne
D'accord merci (mais l'exemple précédent marchait aussi, non ? ).
Et sinon, pourquoi tu met (void*) devant buffer dans les fonctions ?
Dernière modification par xapantu (12-02-2010 13:45:04)
Hors ligne
En fait, tu as posté ton exemple pendant que j'écrivais le mien, du coup je ne l'ai vu qu'après. En fait, c'est la même chose, mais le tien est peut être un peu plus propre au niveau du copy.
Le (void*) n'est pas nécessaire, mais c'est plus propre, je préfère (vu que la fonction demande en entrée un void* et non un char*). Et je me demande si c'est pas obligatoire sur certains compilateurs...
Hors ligne
Excusez-moi de relevez se topic, mais j'ai réussi à extraire mon fichier .zip, ou plutôt le fichier que je voulais extraire de mon fichier .zip, mais comment faire pour extraire entièrement mon fichier .zip, même si je ne connais pas les fichiers qui sont contenue dans celui-ci
Je vous remercie d'avance pour vos réponse
Hors ligne
Avec une boucle for sur la liste des fichiers.
Tu peux utiliser l'indice du fichier plutôt que son nom si tu ne le connais pas.
Hors ligne
ok, je te remercie, j'ai réussi à faire l'extraction comme je veux, mais il y a un problème encore, j'ai un dossier dans mon archive, et quand j'essaye de le crée avec la fonction :
createAndWriteFile (const path &filename, bool append=false)=0
le problème, c'est que sa me crée un fichier portant le nom de se dossier, et cela me met dezippe les autres fichier dans dossier de l'archive alors que je voudrai que sa me crée un dossier à la place d'un fichier, et que sa me place les fichiers copris dans se dossier....Bah dans le dossier xD
Voilà mon code au cas où :
Dernière modification par narugohan (20-04-2010 22:02:00)
Hors ligne