[Problem avec NextPackFile] problem isolé
[Problem avec NextPackFile] problem isolé
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 ?
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.

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)
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()
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
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
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
Code : Tout sélectionner
debug NomFichier$
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
merci j'ai donc verifié
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
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
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
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()
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
Salut cha0s
je n'avais pas tout vu hier soir.
Ta routine de compression me semble oK
La décompression a quelques problèmes
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
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)
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.
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
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
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)
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
Je suis surpris qu'il ne veuille pas des exe Darkbasic.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
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.