Problème avec CreateXMLNode

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Problème avec CreateXMLNode

Message par Micoute »

Bonsoir à tous,

est-ce que quelqu'un pourrait m'expliquer les arguments de la fonction CreateXMLNode, car l'ide n'est pas très explicite.

Je vous remercie tous du fond du coeur.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec CreateXMLNode

Message par falsam »

Avant toute chose, une petite observation, depuis la version 5.30, La gestion des fichier XML diffère un peu des versions précédentes y compris la version 5.23 LTS.
Micoute a écrit :est-ce que quelqu'un pourrait m'expliquer les arguments de la fonction CreateXMLNode
CreateXML() Crée un objet XML vide.

Sa syntaxe est Resultat = CreateXML(#XML [, Encodage]) (PB 5.30)

Finalement cette fonction n'est pas difficile à appréhender
Un identifiant xml et un encodage qui prendra la valeur #PB_UTF8 par défaut que je te conseille de garder si tu dois stocker des accents.

Un exemple pour finaliser ces explications dans lequel nous allons :
- Créer un objet XML
- Créer un noeud <Adresse> ... </Adresse> dans lequel on va insérer les nœuds fils
      <Name> ... </Name>
      <Telephone> ... </Telephone>
-Sauvegarder cette objet dans un fichier de type XML.

Code : Tout sélectionner

EnableExplicit
Enumeration 
  #XMLObject
EndEnumeration

Global XMLFileName.s = "test.xml", RootNode, ChildNode

; Création d'un objet xml 
CreateXML(#XMLObject, #PB_UTF8 )

;Creation du noeud adresse qui contiendra les les nœuds fils de l'adresse
RootNode = CreateXMLNode(RootXMLNode(#XMLObject), "Adresse") 

; Ajout du noeud enfant nom et de la valeur associée
ChildNode = CreateXMLNode(RootNode, "Name") ;Le nœuds
SetXMLNodeText(ChildNode, "Joe Down")  ;La valeur    

; Ajout du noeud enfant téléphone et de la valeur associée
ChildNode = CreateXMLNode(RootNode, "Telephone") 
SetXMLNodeText(ChildNode, "0631224565")

;Sauvegarde dans un fichier XML
SaveXML(#XMLObject, XMLFileName)
FreeXML(#XMLObject)
N'oublies pas de sauvegarder ce code dans un dossier :)

Le fichier xml que tu retrouveras dans ce dossier aura cette structure
<?xml version="1.0" encoding="UTF-8"?><Adresse><Name>Joe Down</Name><Telephone>0631224565</Telephone></Adresse>
Pour enregistrer plusieurs adresses, la technique est un peu différente. Si toi ou quelqu'un d'autre souhaite une explication, n'hésitez pas à demander :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec CreateXMLNode

Message par Micoute »

Bonjour falsam,

je ne comprend pas, j'ai fait comme tu m'as dit, mais j'ai une erreur à la décompression, car le programme ne reconnaît pas l'archive.

Je t'envoie mon code pour que tu voies ce qui ne va pas, j'imagine qu'il est inutile que je te dise de changer les chemins des fichier !

Code : Tout sélectionner

;/ *** Format fichier CFz ***
;/ (ConteneurFichiers ZIP)
;/ Août 2014 Michel Lye
;/ nécessaire PureBasic V5.30

UseZipPacker()

#CFXmlZip = 0      ; #XML Nombre (éventuellement ajuster)
#CFPackZip = 0     ; #Pack Nombre (éventuellement ajuster)

#CleAES = "CleDeMonProg1234AES5678" ; définir sa propre clé !!!
#CleDES = "D12E34S"                 ; définir sa propre clé !!!

#ExtFichierAES = "acf"

Structure CFzipStructure
  ; --- Personnaliser les informations conteneur si nécessaire ---
  Type.s
  Info.s
  Auteur.s
  ; -------------------------------------
  Map *Fichier()
EndStructure
Global CFzip.CFzipStructure


;- Outils

Procedure.s FileNoExtension(Fichier.s)
  ; chemin et nom du fichier sans l'extension
  ProcedureReturn Left(Fichier, Len(Fichier)-Len(GetExtensionPart(Fichier))-1)
EndProcedure

Procedure CFzip_GetPackFileSize(NomFichier.s)
  ; taille non compressée du fichier dans le ZIP
  If ExaminePack(#CFPackZip)
    While NextPackEntry(#CFPackZip)
      If PackEntryName(#CFPackZip) = NomFichier
        ProcedureReturn PackEntrySize(#CFPackZip)
      EndIf
    Wend
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure CFzip_ClearFileInfo()
  ; Réinitialiser Structure et Map
  ; --- Personnaliser les informations du conteneur si nécessaire ---
  CFzip\Type = ""
  CFzip\Info = ""
  CFzip\Auteur = ""
  ; -------------------------------------
  ClearMap(CFzip\Fichier())
EndProcedure

Procedure.s CFzip_GetFileInfo(Fichier.s, Attribut.s="")
  ; Lire les informations sur le fichier
  *Fichier = CFzip\Fichier(GetFilePart(Fichier))
  If *Fichier
    If Attribut
      ProcedureReturn GetXMLAttribute(*Fichier, Attribut)
    Else
      ProcedureReturn GetXMLNodeText(*Fichier)
    EndIf
  EndIf
EndProcedure


;- Codage AES

; En utilisant l'identifiant de fichier on peut vérifier s'il s'agit d'un fichier valide 
; pour le programme ou de l'action du fichier.

Procedure.b CFzip_WriteAESPack(Fichier.s, MotDePasse.s, IDFichier.s="monProg", calme.b=#False)
  Protected LongueurFichier.l, SFId.l, Cle$= #CleAES, Resultat.b = #False
  Protected *FichierMemoire, *Memoire, *IDMemoire
  Protected NomFichier.s = GetFilePart(Fichier)
  Protected FichierAES.s = FileNoExtension(NomFichier) + "." + #ExtFichierAES
  Protected MdpDES.s = DESFingerprint(MotDePasse, #CleDES)
  
  If FileSize(Fichier) <= 0
     ProcedureReturn #False
  EndIf
  
  SFId = ReadFile(#PB_Any, Fichier)
  If SFId
    LongueurFichier = Lof(SFId)                                     ; longueur du fichier
    *FichierMemoire = AllocateMemory(LongueurFichier)
    If *FichierMemoire
      If ReadData(SFId, *FichierMemoire, LongueurFichier)
        ; Calculer la taille d'en-tête
        TailleEntete = StringByteLength(IDFichier) + StringByteLength(MdpDES) + 
                       StringByteLength(NomFichier) + 11
        ; Allouer de la mémoire pour en-tête et fichier
        TailleMemoire = TailleEntete + MemorySize(*FichierMemoire)
        *Memoire = AllocateMemory(TailleMemoire)
        If *Memoire
          *IDMemoire = *Memoire
          ;{ écrire en-tête
          PokeS(*IDMemoire, IDFichier)                   ; IDFichier (p.e. "monProg")
          *IDMemoire + StringByteLength(IDFichier) + 1
          PokeL(*IDMemoire, LongueurFichier)             ; Longueur réelle du fichier
          *IDMemoire + 4
          PokeS(*IDMemoire, MdpDES)                      ; Mote de passe DES
          *IDMemoire + StringByteLength(MdpDES) + 1
          PokeS(*IDMemoire, NomFichier)                  ; Nom du fichier
          *IDMemoire + StringByteLength(NomFichier) + 1
          ;}
          If AESEncoder(*FichierMemoire, *IDMemoire, MemorySize(*FichierMemoire), @Cle$, 128, 0, 
                        #PB_Cipher_ECB)
            If AddPackMemory(#CFPackZip, *Memoire, TailleMemoire, FichierAES)
              Resultat = #True
            EndIf
          EndIf
          FreeMemory(*Memoire)
        EndIf
      ElseIf calme = #False
        MessageRequester(" CFzip - Ouverture fichier", "Le fichier ne peut pas être lu!", 
                         #MB_OK|#MB_ICONERROR)
      EndIf
      FreeMemory(*FichierMemoire)
    EndIf
    CloseFile(SFId)
  EndIf
  ProcedureReturn Resultat
EndProcedure

Procedure.s CFzip_ReadAESPack(FichierAES.s, MotDePasse.s, CheminCible.s="", IDFichier.s="monProg", 
                              calme.b=#False)
  Protected FileSize.l, MemIDFichier.s, MemMdpDES.s, NomFichier.s, LongueurFichier.l, TFId.l, 
Cle$ = #CleAES
  Protected *FichierMemoire, *Memoire, *IDMemoire
  Protected MdpDES.s = DESFingerprint(MotDePasse, #CleDES)
  
  If CheminCible = "" : CheminCible = GetPathPart(FichierAES) : EndIf
  
  FileSize = CFzip_GetPackFileSize(GetFilePart(FichierAES))
  If FileSize
    *Memoire = AllocateMemory(FileSize)
    If *Memoire
      *IDMemoire = *Memoire
      If UncompressPackMemory(#CFPackZip, *Memoire, FileSize, GetFilePart(FichierAES))
        ; IDFichier
        MemIDFichier = PeekS(*IDMemoire)
        *IDMemoire + StringByteLength(MemIDFichier) + 1
        If IDFichier = MemIDFichier                         ; vérifier IDFichier (p.e. monProg)
          LongueurFichier = PeekL(*IDMemoire)               ; Taille réelle du fichier
          *IDMemoire + 4
          ; lire le mot de passe
          MemMdpDES = PeekS(*IDMemoire)
          *IDMemoire + StringByteLength(MemMdpDES) + 1
          If MdpDES = MemMdpDES             ; vérifier le mot de passe
            NomFichier = PeekS(*IDMemoire)
            *IDMemoire + StringByteLength(NomFichier) + 1
            ; --- décrypter le fichier ---
            *FichierMemoire = AllocateMemory(LongueurFichier)
            If *FichierMemoire
              If AESDecoder(*IDMemoire, *FichierMemoire, LongueurFichier, @Cle$, 128, 0, #PB_Cipher_ECB)
                ; Écrire le fichier sur le disque dur
                TFId = CreateFile(#PB_Any, CheminCible+NomFichier)
                If TFId
                  WriteData(TFId, *FichierMemoire, LongueurFichier)
                  CloseFile(TFId)
                Else
                  If calme ;{ Le fichier ne peut pas être créé
                    NomFichier = "ERREUR:CreateFile"
                  Else
                    NomFichier = ""
                    MessageRequester(" CFzip - Ouverture fichier", 
                                     "Erreur d'accès au fichier CFzip!"+
                                     #LF$+
                                     "Vérifier que vous disposez des droits d'accès nécessaires (RW) "+
                                     "pour le répertoire suivant:"+
                                     #LF$+
                                      GetPathPart(FichierAES), #MB_OK|#MB_ICONERROR)
                  EndIf ;}
                EndIf
              Else
                If calme ;{ Décryption / décompression échouée
                  NomFichier = "ERREUR:AES"
                Else
                  NomFichier = ""
                  MessageRequester(" CFzip - Ouverture fichier", 
                                   "Le fichier ne peut pas être déchiffré!", #MB_OK|#MB_ICONERROR)
                EndIf ;}
              EndIf
              FreeMemory(*FichierMemoire)
            EndIf
          Else  
            If calme ;{ mot de passe incorrect
              NomFichier = "ERREUR:MotDePasse"
            Else
              NomFichier = ""
              MessageRequester(" CFzip - Ouverture fichier", 
                               "Le mot de passe du fichier ne correspond pas au mot de passe de CFzip! "+
                               "L'accès au fichier a été refusé!", 
                               #MB_OK|#MB_ICONWARNING)
            EndIf ;}  
          EndIf
        Else ; 
          If calme ;{ mauvais IDFichier
            NomFichier = "ERREUR:IDFichier"
          Else
            NomFichier = ""
            MessageRequester(" CFzip - Ouverture fichier", "fichier non valide ("+IDFichier+")!", 
                             #MB_OK|#MB_ICONERROR)
          EndIf ;} 
        EndIf
      EndIf
      FreeMemory(*Memoire)
    EndIf
  Else
    If calme ;{ Le fichier n'est pas dans le ConteneurFichiers
      NomFichier = "ERREUR:ConteneurFichiers"
    Else
      NomFichier = ""
      MessageRequester(" CFzip - Ouverture fichier", "Le fichier n'a pas été trouvé dans le fichier de "+
      "package!", #MB_OK|#MB_ICONERROR)
    EndIf ;}
  EndIf
  ProcedureReturn NomFichier
EndProcedure


; Décoder un fichier crypté (en dehors du ConteneurFichiers)
Procedure.s CFzip_DecodeFichierAES(FichierAES.s, MotDePasse.s, CheminCible.s="", IDFichier.s="monProg", 
                                   calme.b=#False)
  Protected NomFichier.s, LongueurFichier.l, TFId.l, SFId.l, Cle$ = #CleAES
  Protected *FichierMemoire, *Memoire
  Protected MdpDES.s = DESFingerprint(MotDePasse, #CleDES)

  If FileSize(FichierAES) <= 0 : ProcedureReturn "" : EndIf
  If CheminCible = "" : CheminCible = GetPathPart(FichierAES) : EndIf
  
  SFId = ReadFile(#PB_Any, FichierAES)
  If SFId
    If ReadString(SFId) = IDFichier   ; IDFichier (fichier valide?) vérifier
      LongueurFichier = ReadLong(SFId); Longueur du fichier
      If ReadString(SFId) = MdpDES    ; vérifier le mot de passe
        NomFichier = ReadString(SFId) ; Nom du fichier avec l'extension
        *Memoire = AllocateMemory(LongueurFichier)
        If *Memoire
          If ReadData(SFId, *Memoire, LongueurFichier)
            *FichierMemoire = AllocateMemory(MemorySize(*Memoire))
            If *FichierMemoire
              If AESDecoder(*Memoire, *FichierMemoire, LongueurFichier, @Cle$, 128, 0, #PB_Cipher_ECB)
                TFId = CreateFile(#PB_Any, CheminCible+NomFichier)
                If TFId
                  WriteData(TFId, *FichierMemoire, LongueurFichier)
                  CloseFile(TFId)
                Else
                  If calme ;{ Le fichier ne peut pas être créé
                    NomFichier = "ERREUR:CreateFile"
                  Else
                    NomFichier = ""
                    MessageRequester(" CFzip - Ouverture fichier", 
                                     "Erreur d'écriture du fichier décrypté!"+#LF$+
                                     "Vérifier que vous disposez des droits d'accès nécessaires (RW) "+
                                     "pour le répertoire suivant:"+#LF$+
                                     GetPathPart(FichierAES), #MB_OK|#MB_ICONERROR)
                  EndIf ;}
                EndIf 
              Else
                If calme ;{ Décryption / décompression échouée
                  NomFichier = "ERREUR:AES"
                Else
                  NomFichier = ""
                  MessageRequester(" CFzip - Ouverture fichier", "Le fichier ne peut pas être déchiffré!", 
                                   #MB_OK|#MB_ICONERROR)
                EndIf ;}  
              EndIf
              FreeMemory(*FichierMemoire)  
            EndIf
          Else
            NomFichier = ""
          EndIf
          FreeMemory(*Memoire)
        Else
          NomFichier = ""
        EndIf
      Else
        If calme ;{ mauvais mot de passe
          NomFichier = "ERREUR:MotDePasse"
        Else
          NomFichier = ""
          MessageRequester(" CFzip - Ouverture fichier", 
                           "Le mot de passe du fichier ne correspond pas au mot de passe de CFzip! "+
                           "L'accès au fichier a été refusé!", 
                           #MB_OK|#MB_ICONWARNING)
        EndIf ;}
      EndIf
    Else
      If calme ;{ mauvais IDFichier
        NomFichier = "ERREUR:IDFichier"
      Else
        NomFichier = ""
        MessageRequester(" CFzip - Ouverture fichier", "fichier  (" + IDFichier + ") non valide !", 
                         #MB_OK|#MB_ICONERROR)
      EndIf ;}
    EndIf
    CloseFile(SFId)
  Else
    If calme ;{ Le fichier ne peut pas être lu
      NomFichier = "ERREUR:FichierAES" 
    Else
      NomFichier = ""
      MessageRequester(" CFzip - Ouverture fichier", "Impossible de lire le fichier!", 
                       #MB_OK|#MB_ICONERROR)
    EndIf ;}
  EndIf
  ProcedureReturn NomFichier
EndProcedure


;- "contenu.xml"Gérer (informations sur le contenu du ConteneurFichiers)

Procedure CFzip_CreateContentXML(Type.s, Info.s, Auteur.s)
  ; Créer un nouveau fichier XML
  ; Si nécessaire, ajuster les paramètres de CFzipStructure (voir ci-dessous)
  If CreateXML(#CFXmlZip)
    *NoeudPrincipal = CreateXMLNode(RootXMLNode(#CFXmlZip),"Contenu")
    If *NoeudPrincipal
      ;Debug GetXMLNodeName(*NoeudPrincipal)
      SetXMLNodeName(*NoeudPrincipal, "Contenu")
      ;Debug GetXMLNodeName(*NoeudPrincipal)
      ; --- Personnaliser les informations du conteneur si nécessaire ---
      SetXMLAttribute(*NoeudPrincipal, "type", Type)
      SetXMLAttribute(*NoeudPrincipal, "info", Info)
      SetXMLAttribute(*NoeudPrincipal, "Auteur", Auteur)
      ; -------------------------------------
      CFzip\Type = Type
      CFzip\Info = Info
      CFzip\Auteur = Auteur
      ; -------------------------------------
      ProcedureReturn #True
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure


Procedure CFzip_OpenContentXML()
  ; Lecture d'un fichier XML et le stocker dans la structure
  ; Paramètre nécessaire uniquement si
  Protected *MemXml, TailleXml.l
  
  CFzip_ClearFileInfo() ; Structure & Map Raz / Effacer
  
  ;{ Décompresser et télécharger XML
  TailleXml = CFzip_GetPackFileSize("contenu.xml")
  If TailleXml
    *MemXml = AllocateMemory(TailleXml)
    If *MemXml
      If UncompressPackMemory(#CFPackZip, *MemXml, TailleXml, "contenu.xml")
        CatchXML(#CFXmlZip, *MemXml, TailleXml)
      EndIf
      FreeMemory(*MemXml)
    EndIf
  Else
    ProcedureReturn #False
  EndIf ;}
  
  ;{ sélectionner "contenu.xml"
  If IsXML(#CFXmlZip)
    If XMLStatus(#CFXmlZip) = #PB_XML_Success
      *NoeudPrincipal = MainXMLNode(#CFXmlZip)
      If *NoeudPrincipal
        ; ---Personnaliser les informations du conteneur si nécessaire ---
        CFzip\Type = GetXMLAttribute(*NoeudPrincipal, "type")
        CFzip\Info = GetXMLAttribute(*NoeudPrincipal, "info")
        CFzip\Auteur = GetXMLAttribute(*NoeudPrincipal, "Auteur")
        ; -------------------------------------
        *Contenu = ChildXMLNode(*NoeudPrincipal) ; Fichiers dans le ConteneurFichiers
        While *Contenu 
          CFzip\Fichier(GetXMLNodeText(*Contenu)) = *Contenu
          *Contenu = NextXMLNode(*Contenu)
        Wend
        ProcedureReturn #True
      EndIf
    Else
      Debug "XML: "+XMLError(#CFXmlZip)
    EndIf
  Else
    Debug "XML: Aucun fichier XML valide"
  EndIf ;} 
  
  ProcedureReturn #False
EndProcedure

Procedure CFzip_CloseContentXML()
  ; fichier XML (éventuellement avec des données actualisées) Reprises dans ConteneurFichiers
  Protected *MemXml, TailleXml.l, Resultat.l = #False
  If IsXML(#CFXmlZip)
    TailleXml = ExportXMLSize(#CFXmlZip)
    *MemXml = AllocateMemory(TailleXml)
    If *MemXml
      If ExportXML(#CFXmlZip, *MemXml, TailleXml)
        RemovePackFile(#CFPackZip, "contenu.xml")
        Resultat = AddPackMemory(#CFPackZip, *MemXml, TailleXml, "contenu.xml")
      EndIf  
      FreeMemory(*MemXml)
    EndIf
    FreeXML(#CFXmlZip)
  EndIf
EndProcedure


Procedure CFzip_UpdateContentXML(Fichier.s, supprimer.b=#False, aes.b=#False)
  ; Fichier XML Mise à jour structure & fichier
  If IsXML(#CFXmlZip)
    If supprimer ;{ Supprimer l'entrée du fichier
      *Fichier = CFzip\Fichier(GetFilePart(Fichier))
      If *Fichier
        If DeleteXMLNode(*Fichier)
          DeleteMapElement(CFzip\Fichier(), GetFilePart(Fichier))
          ProcedureReturn #True
        EndIf 
      EndIf
      ;}
    Else      ;{ Mettre à jour ou ajouter l'entrée
      *Fichier = CFzip\Fichier(GetFilePart(Fichier))
      If *Fichier
        SetXMLAttribute(*Fichier, "modifié", Str(GetFileDate(Fichier, #PB_Date_Modified)))
        ProcedureReturn #True
      Else
        *NoeudPrincipal = MainXMLNode(#CFXmlZip)
        If *NoeudPrincipal
          *Noeud = CreateXMLNode(*NoeudPrincipal, "Contenu")
          If *Noeud
            SetXMLNodeName(*Noeud, "Fichier")
            If aes
              SetXMLAttribute(*Noeud, "type", #ExtFichierAES)
            Else
              SetXMLAttribute(*Noeud, "type", GetExtensionPart(Fichier))
            EndIf
            SetXMLAttribute(*Noeud, "modifié", Str(GetFileDate(Fichier, #PB_Date_Modified)))
            SetXMLNodeText(*Noeud, GetFilePart(Fichier))
            CFzip\Fichier(GetFilePart(Fichier)) = *Noeud
            ProcedureReturn #True
          EndIf  
        EndIf
      EndIf ;}
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure


;- ===== ConteneurFichiers =====

Procedure CFzip_CloseContainer()
  ; fermer ConteneurFichiers
  CFzip_CloseContentXML() ; enregistrer contenu.xml
  CFzip_ClearFileInfo()   ; Réinitialiser Structure & Map
  ProcedureReturn ClosePack(#CFPackZip)
EndProcedure

Procedure CFzip_OpenContainer(Container.s)
  ; Ouvrir conteneur de fichiers
  CFzip_CloseContainer() ; peut comprendre conteneur ouvert
  If FileSize(Container) > 0
    If OpenPack(#CFPackZip, Container, #PB_PackerPlugin_Zip)
      ProcedureReturn CFzip_OpenContentXML()
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure


Procedure CFzip_CreateContainer(Conteneur.s, Type.s, Info.s, Auteur.s)
  ; Créer un nouveau conteneur de fichiers
  CFzip_CloseContainer() ; peut comprendre conteneur ouvert
  If FileSize(Conteneur) < 0
    If CreatePack(#CFPackZip, Conteneur, #PB_PackerPlugin_Zip)
      CFzip_CreateContentXML(Type, Info, Auteur)
      ProcedureReturn #True
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure


;- ===== Fichier dans ConteneurFichiers =====

Procedure CFzip_AddFile(Fichier.s)
  ; Ajouter un nouveau fichier dans le conteneur
  If AddPackFile(#CFPackZip, Fichier, GetFilePart(Fichier))
    ProcedureReturn CFzip_UpdateContentXML(Fichier)
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure CFzip_RemoveFile(Fichier.s)
  ; Supprimer le fichier du conteneur
  If RemovePackFile(#CFPackZip, GetFilePart(Fichier)) 
    ProcedureReturn CFzip_UpdateContentXML(Fichier, #True)
  EndIf
  ProcedureReturn #False
EndProcedure


Procedure CFzip_CloseFile(Fichier.s)
  ; Fermer le fichier du conteneur
  RemovePackFile(#CFPackZip, GetFilePart(Fichier))
  If AddPackFile(#CFPackZip, Fichier, GetFilePart(Fichier))
    CFzip_UpdateContentXML(Fichier)
    DeleteFile(Fichier)
    ProcedureReturn #True
  EndIf  
  ProcedureReturn #False
EndProcedure

Procedure CFzip_OpenFile(Fichier.s, CheminCible.s="")
  ; Charger le fichier du conteneur
  If CheminCible
    If Right(CheminCible,1)<> "\" : CheminCible + "\" : EndIf
    ProcedureReturn UncompressPackFile(#CFPackZip, CheminCible + GetFilePart(Fichier), 
                                       GetFilePart(Fichier))
  Else
    ProcedureReturn UncompressPackFile(#CFPackZip, Fichier, GetFilePart(Fichier))
  EndIf
EndProcedure


; ----- fichiers cryptés AES -----

Procedure CFzip_AddFichierAES(Fichier.s, MotDePasse.s)
  ; Ajouter un nouveau fichier et le crypter
  If CFzip_WriteAESPack(Fichier, MotDePasse)
    ProcedureReturn CFzip_UpdateContentXML(Fichier, #False, #True)
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure CFzip_RemoveFichierAES(Fichier.s)
  ; filtre à partir du conteneur de fichier chiffré
  If RemovePackFile(#CFPackZip, GetFilePart(FileNoExtension(Fichier)+"."+#ExtFichierAES)) 
    ProcedureReturn CFzip_UpdateContentXML(Fichier, #True, #True)
  EndIf
  ProcedureReturn #False
EndProcedure


Procedure CFzip_CloseFichierAES(Fichier.s, MotDePasse.s)                       
  ; Déplacer & crypter le fichier dans conteneur
  RemovePackFile(#CFPackZip, GetFilePart(FileNoExtension(Fichier)+"."+#ExtFichierAES))
  If CFzip_WriteAESPack(Fichier, MotDePasse)
    CFzip_UpdateContentXML(Fichier, #False, #True)
    DeleteFile(Fichier)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure.s CFzip_OpenFichierAES(Fichier.s, MotDePasse.s, CheminCible.s="")     
  ; Charger et décrypter le fichier du conteneur
  ProcedureReturn CFzip_ReadAESPack(FileNoExtension(Fichier)+"."+#ExtFichierAES, MotDePasse, 
                                    CheminCible) ; Retour: Nom du fichier extrait
EndProcedure


;- ***** Exemple *****

; Créer un nouveau fichier CFzip (ConteneurFichiers)
If CFzip_CreateContainer("H:\Programmation\FichierTest.cfz", "monProg", "fichiers pour monProg", 
                         "Michel Lye")
  
  ; Ajouter des fichiers
  CFzip_AddFile("H:\Programmation\Test.txt")
  CFzip_AddFichierAES("H:\Programmation\Test2.txt", "test")
  
  ; Afficher les informations de fichier par Map
  
  ForEach CFzip\Fichier() ; lire tous les fichiers
    Debug "Fichier (Map): " + MapKey(CFzip\Fichier())
    *Noeud = CFzip\Fichier()
    If *Noeud
      Debug "Fichier (XML): " + GetXMLNodeText(*Noeud) + " (Type: " + 
            GetXMLAttribute(*Noeud, "type") + ")" 
    EndIf
  Next
  
  ; Voir les informations du fichier en utilisant la Map directement
  If CFzip\Fichier("H:\Programmation\Test2.txt") ; Fichier disponible en fichier CFzip?
    *Noeud = CFzip\Fichier("H:\Programmation\Test2.txt")
    If *Noeud
      Debug "Fichier (XML): " + GetXMLNodeText(*Noeud) + " (Type: " + 
            GetXMLAttribute(*Noeud, "type") + ")" 
    EndIf
  EndIf
  Debug "Type fichier: "+CFzip_GetFileInfo("H:\Programmation\Test2.txt", "type") ; manière simple ;-)
  
  CFzip_CloseContainer()
Else
  Debug "Le fichier CFzip existe déjà!"
EndIf

; Ouvrir le fichier CFzip existant (ConteneurFichiers)
If CFzip_OpenContainer("H:\Programmation\FichierTest.cfz")
  ; accès direct à l'information sur le fichier CFzip
  Debug "----- Fichier CFzip -----"
  Debug "Type: " + CFzip\Type
  Debug "Info: " + CFzip\Info
  Debug "Auteur: " + CFzip\Auteur
  
  ; Ouverture du fichier
  If CFzip_OpenFile("Test.txt", "H:\Programmation\") 
    ; CFzip_OpenFile("Test.txt", "H:\Programmation\") = appel alternatif
    Debug "fichier décompressé: "+Str(FileSize("H:\Programmation\Test.txt"))
    ;CFzip_CloseFile("H:\Programmation\Test.txt") ; Déplacer le fichier modifié dans le fichier CFzip
  EndIf
  
  If CFzip_OpenFichierAES("Test2.txt", "test", "H:\Programmation\")
    Debug "Fichier décrypté et décompressé: "+Str(FileSize("H:\Programmation\Test2.txt"))
    ;CFzip_CloseFichierAES("H:\Programmation\Test2.txt", "test") 
    ; Crypter le fichier de modification et revenir le fichier CFzip
  EndIf
  
  ; il suffit de décompresser le fichier crypté
  CFzip_OpenFile("Test2.acf", "H:\Programmation\") ; lisibilité fichier crypté (Et) Vérifié
  
  CFzip_CloseContainer()
EndIf
Dernière modification par Micoute le dim. 31/août/2014 11:05, modifié 2 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec CreateXMLNode

Message par falsam »

CreateXML() Crée un objet XML vide. Mais ne crée pas le fichier sur disque.

Nul part dans ton code, tu sauvegardes ce fichier avec la commande SaveXML() comme je l'indique dans mon code exemple.


PS: je l'ai déja dit : Si je dois tester un code, je souhaite que ce code soit fonctionnel sans toucher quoi que ce soit. Je n'ai pas envie de passer mon temps à chercher et modifiers des noms de dossiers comme

Code : Tout sélectionner

*Noeud = CFzip\Fichier("H:\Programmation\Test2.txt")
Fournissez dans ce cas un zip fonctionnel !
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre