CreatePack() capricieux ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

CreatePack() capricieux ?

Message 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 ^^
.:NY152:.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: CreatePack() capricieux ?

Message 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
ImageImage
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: CreatePack() capricieux ?

Message 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 ...
.:NY152:.
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: CreatePack() capricieux ?

Message 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 :(
.:NY152:.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: CreatePack() capricieux ?

Message 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
ImageImage
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: CreatePack() capricieux ?

Message 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")


:wink:
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: CreatePack() capricieux ?

Message 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.
ImageImage
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: CreatePack() capricieux ?

Message 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 ...
.:NY152:.
Répondre