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