[Problem avec NextPackFile] problem isolé

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

[Problem avec NextPackFile] problem isolé

Message par cha0s »

salut tt le monde jai un petit problem avec la comande NextPackFile :
jai cree un fichier avec la comande pack .... jajoute,je compresse est tout alors jesaye de decompresser avec un autre log que jai fait jouvre le pack je li le nom du fichier a decompacter ,un nom que ja pris soin de metre dans l pack jusqu ici aucun problem il me cree le fichier alors je maprete a lire le fichier avec NextPackFile et la pouf plantage impossible de lire la memoire ...
quelqu'un a til deja rencontré ce probleme ?
Dernière modification par cha0s le mer. 16/mars/2005 21:44, modifié 1 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

avec du code ça serais plus facil de trouver le problème je pense ;)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

:oops: dsl j'ai pas osé poster mon code tellement c'est ecrit a l'arrache :p

Code : Tout sélectionner

If ReadString()="Unpack"
nb_file=Val(ReadString()) 
If OpenPack("Data\"+file_dl$)
For x=1 To nb_file


      Addresse=NextPackFile()
      NomFichier$=PeekS(addresse) 
      CreateFile(2,"data\"+NomFichier$) 
      While Addresse
;c'est cette ligne la qui plante :     
      addresse=NextPackFile()  
      WriteData(Addresse,PackFileSize())
      addresse=NextPackFile()
      Wend   
      CloseFile(2)

    
Next x
ClosePack()
DeleteFile("Data\"+file_dl$)  
EndIf    
EndIf

Ps ; il a planté seulement pour un executable de 8mo compresse a 2.5mo alors que avec des petits fichier sa marche impec (jai bien sur compiler plusieur fois le gros exe pour voir)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est difficile de répondre sans avoir vu le code de compression.

tu dois absolument tester que la commande CreateFile a résussi car si ça ne réussi pas, ton écriture va planter

Met un debug après la ligne Addresse=NextPackFile()

Code : Tout sélectionner

debug Addresse
Mets un debug après la ligne de code NomFichier$=PeekS(addresse) car j'ai un gros doute sur la chaine récupérée

Code : Tout sélectionner

debug NomFichier$
si adresse vaut 0 c'est pas bon

et si NomFichier$ retourne une chaine bidon, tu saura ou est le problème et dis nous tout

si c'est pas ça poste le code de compression pour que l'on fasse des tests.


j'avais travaillé un peu les commandes packer et j'ai posté ces problèmes, mais je ne sais pas s'ils sont toujours d'actualitécar je n'ai pas repris mon projet.

voir ici

http://purebasic.hmt-forum.com/viewtopi ... xtpackfile
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

merci j'ai donc verifié

Code : Tout sélectionner

If ReadString()="Unpack"
nb_file=Val(ReadString()) 
If OpenPack("Data\"+file_dl$)
For x=1 To nb_file


      Addresse=NextPackFile()
      Debug Addresse 
      NomFichier$=PeekS(addresse)
      Debug NomFichier$ 
      If CreateFile(2,"data\"+NomFichier$) 
      While Addresse     
      addresse=NextPackFile()
      MessageRequester("", "1" )   
      WriteData(Addresse,PackFileSize())
      MessageRequester("", "1" )   
      addresse=NextPackFile()
      Wend   
      CloseFile(2)
      EndIf

    
Next x
ClosePack()
DeleteFile("Data\"+file_dl$)  
EndIf    
EndIf
cela fonctionne adresse n'est pas egale a 0 et NomFichier$ corespond bien au nom de l'exe a decompresser

donc voici le code utilisé pour la compression

Code : Tout sélectionner

      CreatePack(maj_file$)
      nb_file=0
      For x=0 To 1000 Step 1
      If file(x)\chemin<>"" :AddPackMemory(@file(x)\nom,Len(file(x)\nom)+1,9) 
       AddPackFile(file(x)\chemin,9):nb_file=nb_file+1:EndIf 
      Next x 
      ClosePack()
jai stocké dans un tableau le nom et le chemin des fichier a ajouter et je sais que lexe a été ajouté au pack car il met du temp a compresser le fichier ,j'ai esayé de baisser la compression mais rien n'y fait
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

essaye ça

Code : Tout sélectionner

If ReadString()="Unpack"
      nb_file=Val(ReadString())
      If OpenPack("Data\"+file_dl$)
         For x=1 To nb_file
            Addresse=NextPackFile()
            While Addresse     
               NomFichier$=PeekS(addresse)
               addresse=NextPackFile()
               MessageRequester("", "1" )   
               If CreateFile(2,"data\"+NomFichier$)
                  WriteData(Addresse,PackFileSize())
                  MessageRequester("", "1" )   
                  CloseFile(2)
               EndIf
               addresse=NextPackFile()
            Wend   
        Next x
        ClosePack()
        DeleteFile("Data\"+file_dl$) 
      EndIf   
EndIf 
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

:( toujout la meme chose la memoire ne peut etre "read"
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

cha0s a écrit ::( toujout la meme chose la memoire ne peut etre "read"
Bon j'ai corrigé de tête sans faire de test, il y avait des petits problèmes
Je vais faire des essais avec des fichiers ce soir si j'ai le temps.
Là je vais manger :D
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

ok merci c'est simpa de m'aider
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Salut cha0s
je n'avais pas tout vu hier soir.
Ta routine de compression me semble oK

La décompression a quelques problèmes

Code : Tout sélectionner

If ReadString()="Unpack"
nb_file=Val(ReadString())
If OpenPack("Data\"+file_dl$)
   For x=1 To nb_file
      Addresse=NextPackFile()
      Debug Addresse
      NomFichier$=PeekS(addresse)
      Debug NomFichier$
      If CreateFile(2,"data\"+NomFichier$)
         While Addresse     
             addresse=NextPackFile()
            ; MessageRequester("", "1" )   
             WriteData(Addresse,PackFileSize())
            ; MessageRequester("", "1" )   
            addresse=NextPackFile()
         Wend   
         CloseFile(2)
      EndIf
Next x
ClosePack()
DeleteFile("Data\"+file_dl$) 
EndIf   
EndIf 
Lorsque tu compresses, le format du fichier compressé ressemble à ça

Nom du 1er fichier (avec ou sans le chemin)
Code du 1er fichier compressé

Nom du fichier suivant (avec ou sans le chemin)
Code du fichier compressé suivant

etc

La boucle while est suffisante pour décompresser tous les fichiers, c'est une erreur de mettre for x = 1 to nb_file

Code : Tout sélectionner

For x=1 To nb_file
      Addresse=NextPackFile()
      Debug Addresse
      NomFichier$=PeekS(addresse)
      Debug NomFichier$
      If CreateFile(2,"data\"+NomFichier$)
      While Addresse     
      addresse=NextPackFile()
      MessageRequester("", "1" )   
      WriteData(Addresse,PackFileSize())
      MessageRequester("", "1" )   
      addresse=NextPackFile()
      Wend   
      CloseFile(2)
      EndIf
Next x
Tu vas lire le pack puis terminer et ensuite tu te situes à la fin du pack; tu reboucles sur ton for x et tu fais ceci Addresse=NextPackFile() ce qui ne peut faire qu'un plantage car il n'y a plus rien dans le pack.
Puisque c'est toi qui compresse, tu connais à l'avance le nombre de fichiers à décompresser, mais si tu décompresses un fichier créé par quelqu'un d'autre, tu ne connais pas à priori le nombre de fichiers contenus dans l'archive. La décompression doit se faire sans connaître à l'avance le nombre de fichiers.


Maintenant le code de décompression par lui-même (le tient)

Code : Tout sélectionner

      Addresse=NextPackFile()
      NomFichier$=PeekS(addresse)
      CreateFile(2,"data\"+NomFichier$)
      While Addresse
;c'est cette ligne la qui plante :     
      addresse=NextPackFile() 
      WriteData(Addresse,PackFileSize())
      addresse=NextPackFile()
      Wend   
      CloseFile(2)
tu récupères la 1ere adresse et c'est Ok, adresse qui correspond au nom de fichier
ensuite , ensuite tu cré le fichier, et là ça cause un problème car tu dois créer un fichier pour chaque nouvelle chaine trouvée dans le pack alors que ta création de fichier a lieu en dehors de la boucle while.

Autre chose, la commande messagerequester a 3 parametres, tu en mets 2, par chance ça fonctionne mais peut-être que ça pourrait entraîner un disfonctionnement. Ajoute le 3ème paramètre.
J'ai vérifié dans les fichiers résidents et effectivement il existe bien un appel de cette fonction avec 2 paramètres, mais ça doit être utilisé par PB en interne. Je Vais le signaler à Fred.

Voici un code écrit sans tests, essayes-le car le code que tu as mis sur le forum n'est pas complet pour que je fasse des essais. Je ne sais pas à quoi correspond ReadString()="Unpack" etc

Pour faire des essais, tu dois décompresser dans un dossier différent du dossier d'origine et comparer.

Code : Tout sélectionner

If ReadString()="Unpack"
      If OpenPack("Data\"+file_dl$)
            Addresse=NextPackFile()
            While Addresse     
               NomFichier$=PeekS(addresse)
               addresse=NextPackFile()
               If CreateFile(2,"data\"+NomFichier$)
                  WriteData(Addresse,PackFileSize())
                  CloseFile(2)
               EndIf
               addresse=NextPackFile()
            Wend   
        ClosePack()
        DeleteFile("Data\"+file_dl$)
      EndIf   
EndIf
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

ok je vais tester sa merci pour ce qui est du unpack c pasque le log de compressione envoie les donnée sur mon fpt et le log client les recupere pour mettre le log a jour pour cela jai donc creer un fichier qui contient un script (telecharger ceci,decomrpesser cela etc....)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

bon sa marche pas du tout et sa comence a me souler jai fait plein de test et jai une conclusion il veut aps de mes EXE en darkbasic alors tout les autre type de fichier marche dont les exe autre que ceux de darkbasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

cha0s a écrit :bon sa marche pas du tout et sa comence a me souler jai fait plein de test et jai une conclusion il veut aps de mes EXE en darkbasic alors tout les autre type de fichier marche dont les exe autre que ceux de darkbasic
Je suis surpris qu'il ne veuille pas des exe Darkbasic.
As-tu lu le post dont j'ai mis l'adresse dans un précédabnt message ?
Il y avait des problèmes

Il faut absolument que tu testes le résultat des fonctions telles que AddPackFile car si elle échoue, et ça arrive ! la structure de ton archive est fausse d'ou possibilité de plantage.


Il y avait aussi le problème des noms de fichiers compactés, essaye de mettre le taux de compression à 0, car parfois la chaine était compactée et le retour du nom était faux.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

deja le nom est bon puisque le fichier cree a le nom voulue (cf createfile ..) ensuite jai fait des test lors de la compression et addpackfile me renvoie 1 donc je pense que c'est bon na?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Poste tout le code, car ça doit fonctionner.

Il y a une erreur quelque part
Répondre