#1 

11-02-2010 13:55:37

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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 smile

D'avance, merci !


Hors ligne


#2 

11-02-2010 14:49:43

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 91.103.40.50
Courriel  Site web

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/classirr_1_1io_1_1_i_file_archive.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


#3 

11-02-2010 15:57:43

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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... sad


Hors ligne


#4 

11-02-2010 16:27:35

nabouill
Membres
Avatar de nabouill
Date d'inscription:
Messages: 242
IP: 82.127.58.127
Courriel

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


#5 

11-02-2010 16:29:46

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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 smile .


Hors ligne


#6 

11-02-2010 16:50:11

Ilovechocolat
Membres
Date d'inscription:
Messages: 125
IP: 90.29.69.215
Courriel

Est-ce-que tes zip ont un mot de pass ?


Hors ligne


#7 

11-02-2010 17:11:23

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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


#8 

11-02-2010 18:15:40

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 83.114.19.29
Courriel  Site web

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.

Code c++ :


...

//Récupère le FileSystem
IFileSystem*  pfs = device->getFileSystem();
//Ajoute ton archive
pfs->addZipFileArchive("zip.zip"); //Attention au chemin
//Récupère ton archive
IFileArchive * zipfile = pfs->getFileArchive(0);
//Récupère le premier fichier de ton archive
IReadFile* file = zipfile->createAndOpenFile(0);
//Ou Encore
IReadFile* file2 = zipfile->createAndOpenFile("monfichierdanslezip.txt");


Hors ligne


#9 

11-02-2010 18:32:08

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

Super, merci beaucoup smile
Je vais essayer de finir ça en décompressant les fichiers, je n'avais pas du tout compris le principe de la classe IFileArchive smile


Hors ligne


#10 

11-02-2010 19:31:23

Ilovechocolat
Membres
Date d'inscription:
Messages: 125
IP: 90.29.69.215
Courriel

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.


Hors ligne


#11 

11-02-2010 20:07:31

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

Ok, merci smile
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 sad

Merci beaucoup pour tout big_smile !


Hors ligne


#12 

12-02-2010 07:58:05

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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 sad

Quelqu'un a une idée big_smile ?

Et encore merci pour l'aide !


Hors ligne


#13 

12-02-2010 11:27:52

Ilovechocolat
Membres
Date d'inscription:
Messages: 125
IP: 90.29.69.215
Courriel

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.


Hors ligne


#14 

12-02-2010 12:08:16

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

Non, ce n'est pas que de données sur un mesh, par exemple :

virtual s32 irr::io::IReadFile::read  	(  	void *   	 buffer,
		u32  	sizeToRead	 
	)

et il y a l'équivalent avec write :
virtual s32 irr::io::IWriteFile::write  	(  	const void *   	 buffer,
		u32  	sizeToWrite	 
	)

http://irrlicht.sourceforge.net/docu/classirr_1_1io_1_1_i_write_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 sad


Hors ligne


#15 

12-02-2010 12:15:32

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

Hors ligne


#16 

12-02-2010 12:24:30

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

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 wink


Hors ligne


#17 

12-02-2010 12:30:47

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 91.103.40.50
Courriel  Site web

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 :

Code c++ :


//Récupère le FileSystem
IFileSystem*  pfs = device->getFileSystem();
//Ajoute ton archive
pfs->addZipFileArchive("zip.zip"); //Attention au chemin
//Récupère ton archive
IFileArchive * zipfile = pfs->getFileArchive(0);
//Récupère le premier fichier de ton archive
IReadFile* fichierlu = zipfile->createAndOpenFile("monfichierlu.txt");
if (fichierlu)
{
	u32 size = fichierlu->getSize(); //La taille du fichier
	//Création du buffer
	char* buffer = new char[size];
	//Lecture du fichier
	fichierlu->read((void*) buffer, size);
	//On créé le fichier à écrite
	IWriteFile* fichierecrit = pfs->createAndWriteFile("chemin/monfichierecrit.txt");
	if (fichierecrit)
	{
		//Ecriture
		fichierecrit->write((void*) buffer, size);
		//Libération mémoire
		fichierecrit->drop();
	}
	//On libère la mémoire, très important
	delete[] buffer;
	buffer = 0;
	fichierlu->drop();
	
}


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


#18 

12-02-2010 12:44:02

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

D'accord merci smile (mais l'exemple précédent marchait aussi, non big_smile ? ).

Et sinon, pourquoi tu met (void*) devant buffer dans les fonctions ?


Hors ligne


#19 

12-02-2010 17:18:58

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 83.114.19.29
Courriel  Site web

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


#20 

13-02-2010 18:13:40

xapantu
Membres
Date d'inscription:
Messages: 12
IP: 88.176.212.67
Courriel

D'accord, merci pour tout smile


Hors ligne


#21 

20-04-2010 01:30:34

narugohan
Membres
Avatar de narugohan
Date d'inscription:
Messages: 113
IP: 92.129.97.73
Courriel

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


#22 

20-04-2010 09:30:10

Hawk
Membres
Date d'inscription:
Messages: 91
IP: 91.103.40.50
Courriel  Site web

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.

Code c++ :


...

//Récupère le FileSystem
IFileSystem*  pfs = device->getFileSystem();
//Ajoute ton archive
pfs->addZipFileArchive("zip.zip"); //Attention au chemin
//Récupère ton archive
IFileArchive * zipfile = pfs->getFileArchive(0);
//Récupère le nombre de fichier
//Je n'ai pas la méthode sous le nez, mais ça doit se trouver
int nb_files = ...
//Boucle for :
for (int i = 0; i < nb_files; i++)
{
    //Récupère le fichier de ton archive
    IReadFile* file = zipfile->createAndOpenFile(i);
    //....
}


Hors ligne


#23 

20-04-2010 20:01:35

narugohan
Membres
Avatar de narugohan
Date d'inscription:
Messages: 113
IP: 81.53.34.19
Courriel

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ù :

Code c++ :


//Récupère le FileSystem
        IFileSystem*  pfs = device->getFileSystem();
        //Ajoute ton archive
        pfs->addZipFileArchive("MAJ.zip");
        //Récupère ton archive
        IFileArchive * zipfile = pfs->getFileArchive(0);
        const IFileList *fileList = zipfile->getFileList();
        u32 nbxFile = fileList->getFileCount();
        QMessageBox::information(this, "Mise à jour news", "Nbx de fichier : " + QString::number(nbxFile) );

        //pfs->drop();
        //zipfile->drop();
        //Boucle for :
        for (int i = 0; i < nbxFile; i++)
        {
            //Récupère le fichier de ton archive
            IReadFile* file = zipfile->createAndOpenFile(i);
            ///--->>><<<---///
            u32 size = file->getSize(); //La taille du fichier
            //Création du buffer
            char* buffer = new char[size];
            //Lecture du fichier
            file->read((void*) buffer, size);
            //On créé le fichier à écrite
            if( fileList->isDirectory(i) )
                QMessageBox::information(this, "Mise à jour news", "test" );
            IWriteFile* fichierecrit = pfs->createAndWriteFile(fileList->getFullFileName(i));
            if (fichierecrit)
            {
                //Ecriture
                fichierecrit->write((void*) buffer, size);
                //Libération mémoire
                fichierecrit->drop();
            }
            //On libère la mémoire, très important
            delete[] buffer;
            buffer = 0;
            file->drop();
            ///--->>><<<---///
        }


Hors ligne


#24 

21-04-2010 22:01:41

narugohan
Membres
Avatar de narugohan
Date d'inscription:
Messages: 113
IP: 81.53.34.19
Courriel

UP SVP


Hors ligne


#25 

25-04-2010 09:57:54

narugohan
Membres
Avatar de narugohan
Date d'inscription:
Messages: 113
IP: 81.53.34.19
Courriel

deuxieme UP... personne ?


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
572 invités en ligne
membre en ligne: -
RSS Feed