Page 1 sur 1
CreatePack() capricieux ?
Publié : sam. 29/avr./2017 1:59
par NY152
Bonjour,
Au sein d'un programme, j'utilise un fichier texte pour y stocker des données.
J'aimerais le compresser ponctuellement dans mon application.
Seulement, je me trouve devant une incompréhension.
Le code le plus basique pour la création d'une archive ne fonctionne pas.
Code : Tout sélectionner
UseLZMAPacker()
If CreatePack(0, "Data.xxx", #PB_PackerPlugin_LZMA)
AddPackFile(0, GetPathPart(ProgramFilename()) + "data.txt", "data.txt")
ClosePack(0)
EndIf
J'ai essayé de voir quelle valeur renvoyait CreatePack(); Toujours 0, donc pas de création ... Le fichier texte est bien présent et parfaitement accessible puisque j'y écris des données dedans et j'ai bien vérifié qu'il est bien clos avant de l'archiver.
Ce code seul ne fonctionne pas chez moi (j'ai bien coché la case dans le débugger pour qu'il créer l’exécutable dans le répertoire de la source pour y trouver un fichier texte de test)
Si quelqu'un a une idée, je suis preneur ^^
Re: CreatePack() capricieux ?
Publié : sam. 29/avr./2017 2:19
par case
pourtant j'ai teste et cela fonctionne
"il faut cocher create temporary executable in the source folder"
j'ai juste crée un fichier texte data.txt dans le repertoire ou est sauvé le code
Code : Tout sélectionner
UseLZMAPacker()
Debug "###############verification PATH#####################"
Debug GetPathPart(ProgramFilename()) + "data.txt"
Size=FileSize(GetPathPart(ProgramFilename()) + "data.txt")
If Size>=0
Debug "Fichier trouvé ... taille : "+Str(size)
EndIf
Debug "############### Creation pack #####################"
If CreatePack(0, "Data.xxx", #PB_PackerPlugin_Lzma)
AddPackFile(0, GetPathPart(ProgramFilename()) + "data.txt", "data.txt")
ClosePack(0)
EndIf
Debug "############### verification pack #####################"
; Ouvre le fichier compressé
If OpenPack(0, "Data.xxx")
; Liste toutes les entrées
If ExaminePack(0)
While NextPackEntry(0)
Debug "Nom: " + PackEntryName(0) + ", Taille: " + PackEntrySize(0)
Wend
EndIf
ClosePack(0)
EndIf
resultat :
###############verification PATH#####################
C:\Users\case\Documents\Pure_basic\data.txt
Fichier trouvé ... taille : 16
############### Creation pack #####################
############### verification pack #####################
Nom: data.txt, Taille: 16
Re: CreatePack() capricieux ?
Publié : sam. 29/avr./2017 20:51
par NY152
Je viens de teste ton code et ... ça marche pas ^^
Retour Debug
Code : Tout sélectionner
###############verification PATH#####################
E:\Programmation\GestionTFE\data.txt
Fichier trouvé ... taille : 36172800
############### Creation pack #####################
############### verification pack #####################
La case à cocher permettant la création de l'exécutable dans le répertoire des sources est bien présent et le fichier data.txt aussi (puisque le code en renvois la taille)
Mais point de création d'archive.
Mystérieux ...
Re: CreatePack() capricieux ?
Publié : sam. 29/avr./2017 21:48
par NY152
Je me suis "amusé" à approfondir ton code pour en faire ceci :
Code : Tout sélectionner
EnableExplicit
Procedure Pack(Package.s, Fichier.s)
Protected Taille.f = 0
Protected RetValPack.l
UseLZMAPacker()
Taille = FileSize(Fichier)
If Taille >= 0
Debug "###############verification PATH#####################"
Debug Fichier
Debug "Fichier trouvé ... taille : " + Str(Taille)
Else
Debug "Fichier non trouvé ... taille : " + Str(Taille)
EndIf
Debug "############### Creation pack #####################"
RetValPack = CreatePack(0, Package, #PB_PackerPlugin_LZMA)
If RetValPack <> 0
Debug "CreatePack() retourne une valeur autre que zéro (" + RetValPack + "), l'archive a été créée."
AddPackFile(0, Fichier, GetFilePart(Fichier))
Else
Debug "CreatePack() retourne la valeur zéro (" + RetValPack + "), l'archive n'a pas été créée."
EndIf
ClosePack(0)
Debug "############### verification pack #####################"
; Ouvre le fichier compressé
If OpenPack(0, Package)
Debug "L'archive est ouverte"
; Liste toutes les entrées
If ExaminePack(0)
While NextPackEntry(0)
Debug "Nom: " + PackEntryName(0) + ", Taille: " + PackEntrySize(0)
Wend
EndIf
Else
Debug "l'archive n'a pas été ouverte."
ClosePack(0)
EndIf
EndProcedure
pack(GetPathPart(ProgramFilename()) + "data.xxx", GetPathPart(ProgramFilename()) + "data.txt")
Le retour debug donne ceci :
Code : Tout sélectionner
###############verification PATH#####################
E:\Programmation\GestionTFE\data.txt
Fichier trouvé ... taille : 36172800
############### Creation pack #####################
CreatePack() retourne la valeur zéro (0), l'archive n'a pas été créée.
############### verification pack #####################
l'archive n'a pas été ouverte.
Donc le soucis vient bien de CreatePack() mais quant à savoir pourquoi, c'est une autre paire de manche. En effet, selon l'aide, la fonction renvoie, je cite : "une valeur non nulle si le fichier archive a été créé avec succès, ou zéro sinon."
En gros, soit on a une valeur et ça passe, soit c'est 0 et l'archive n'est pas créée mais faut pas être curieux et vouloir en connaitre la cause ...
Perso, je sèche

Re: CreatePack() capricieux ?
Publié : dim. 30/avr./2017 0:02
par case
afin d’être sur voir si le fichier n'est pas utilisé par ailleurs j'ai ajouté un test avec readfile ca peux donner une piste.
Code : Tout sélectionner
UseLZMAPacker()
Debug "###############verification PATH#####################"
Debug GetPathPart(ProgramFilename()) + "data.txt"
Size=FileSize(GetPathPart(ProgramFilename()) + "data.txt")
If Size>=0
Debug "Fichier trouvé ... taille : "+Str(size)
RD=ReadFile(#PB_Any,GetPathPart(ProgramFilename()) + "data.txt")
If RD
closefile(RD)
Else
Debug "Fichier ne peut etre lu"
EndIf
EndIf
Debug "############### Creation pack #####################"
If CreatePack(0, "Data.xxx", #PB_PackerPlugin_Lzma)
AddPackFile(0, GetPathPart(ProgramFilename()) + "data.txt", "data.txt")
ClosePack(0)
EndIf
Debug "############### verification pack #####################"
; Ouvre le fichier compressé
If OpenPack(0, "Data.xxx")
; Liste toutes les entrées
If ExaminePack(0)
While NextPackEntry(0)
Debug "Nom: " + PackEntryName(0) + ", Taille: " + PackEntrySize(0)
Wend
EndIf
ClosePack(0)
EndIf
Re: CreatePack() capricieux ?
Publié : dim. 30/avr./2017 9:32
par Marc56
Quelques bonnes pratiques:
- Isoler les noms de fichier au début du prog:
- Permet de modifier les fichiers sans devoir chercher dans le code tous les emplacements
- Évite de se tromper en ajoutant ou oubliant des \
- Permet de vérifier la bonne concaténation des noms avant utilisation (ex Debug "Fichier: " + FileName)
- Utiliser des chemins complets
- Utiliser GetTemporaryDirectory() (pas de problème de droits d'écriture)
- Vérifier que le fichier n'existe pas ou que le nom n'est pas déjà utilisé par un répertoire
FileSize (attention: -2 = le fichier est un répertoire et donc ne sera pas remplacé)
https://www.purebasic.com/french/docume ... esize.html
GetTemporaryDirectory()
https://www.purebasic.com/french/docume ... ctory.html
PS. L'exemple proposé par Case fonctionne très bien chez moi.
Possible problème: fichier existant ? droits d'écriture ? etc
À tester en premier: compresser le même fichier au même endroit avec un autre programme (7zip ou autre)
En second, tester la taille du fichier avant/après: Debug FileSize("Data.xxx")

Re: CreatePack() capricieux ?
Publié : dim. 30/avr./2017 14:53
par case
oui peut être un truc avec le fichier txt
j'avoue que je ne suis pas a même de reproduire le bug chez moi.
Re: CreatePack() capricieux ?
Publié : lun. 01/mai/2017 10:39
par NY152
Le problème semble résolu ^^
Comment ? aucune idée. En fait si, je pense savoir.
J'ai changé l'emplacement de mes sources vers un autre emplacement.
Pourquoi ça ne voulait pas ? Pas un soucis de droits d'accès en tout cas. Il s'agit d'un lecteur réseau ISCSI et c'est peut être de là que vient le soucis !
Etrange tout de même toutes mes autres sources n'ont jamais posées de soucis sur cet emplacement ...