[R] Filewrite, ajout/remplacement de texte

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
benjahinfo
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 08 nov. 2011 11:05
Status : Hors ligne

[R] Filewrite, ajout/remplacement de texte

#1

Message par benjahinfo »

Bonjour,

Donc voila, afin de sauvegarder des noms d'utilisateurs/mot de passe j'ai écris la fonction ci-dessous:

Code : Tout sélectionner

Func SaveUser($UserID, $Password, $AutoConnect = $GUI_UNCHECKED)
    Local $file = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 2 + 8) ;REM = C'est un simple fichier sans extension.
    If $file = -1 Then
        MsgBox(16, "Erreur", "Impossible d'accéder à la sauvegarde des utilisateurs.")
    EndIf
    Local $filecontent = FileRead($file)
    $UserPosition = StringInStr($filecontent, $UserID, 0)
    Select
        Case $UserPosition = 0
            If $AutoConnect = $GUI_CHECKED Then
                StringReplace($filecontent, "True", "False")
                $filecontent &= $UserID & ";" & $Password & ";True" & @LF
            Else
                $filecontent &= $UserID & ";" & $Password & ";False" & @LF
            EndIf
        Case $UserPosition > 0
            Local $BoleanAutoConnect = "False"
            If $AutoConnect = $GUI_CHECKED Then
                StringReplace($filecontent, "True", "False")
                $BoleanAutoConnect = "True"
            EndIf
            Local $filecontent = StringRegExpReplace($filecontent, $UserID & "(.*?)\s", $UserID & ";" & $Password & ";" & $BoleanAutoConnect & @LF) 
    EndSelect
        FileWrite($file, $filecontent)
    FileClose($file)
EndFunc   ;==>SaveUser
Donc mon problème est le suivant: Je veux pouvoir ajouter des utilisateurs "à l'infinie", mais le problème est que ce script remplace toujours mes anciens utilisateurs. Je me retrouve toujours, qu'avec le dernier utilisateur sauvegardé dans mon fichier.

[blink]EDIT:[/blink] Pour une meilleur compréhension de mon problème, veuillez voir mon 4ème Post ! :mrgreen:
Modifié en dernier par benjahinfo le jeu. 28 juin 2012 23:31, modifié 2 fois.
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

Re: [..] Filewrite, ajout/remplacement de texte

#2

Message par Sea »

Remplace

Code : Tout sélectionner

Local $file = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 2 + 8) ;REM = C'est un simple fichier sans extension.
 
Par

Code : Tout sélectionner

Local $file = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 1 + 8) ;REM = C'est un simple fichier sans extension.
 
Le flag 2 va ecrire au début du fichier, flag 1 a la fin du fichier ;)
Avatar du membre
benjahinfo
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 08 nov. 2011 11:05
Status : Hors ligne

Re: [..] Filewrite, ajout/remplacement de texte

#3

Message par benjahinfo »

Merci de ta réponse, mais j'avais déjà essayé.
Avec le flag 1, la partie qui sert à remplacer l'utilisateur existant ne sert plus à rien.
Je pensais en fait:
-Je récupère le contenu du fichier
-Je vérifie s'il existe déjà un utilisateur, dans ce cas je remplace la ligne (pour mise à jour du mot de passe ou du paramètre "Autoconnect")
-Sinon ajouter le nouvel utilisateur avec mot de passe et paramètre "AutoConnect"

à noter qu'un seul utilisateur peut avoir le paramètre "AutoConnect" en True d'ou le StringReplace.

Je remarque une erreur dans mon script, je veux que le résultat dans le fichier soit de la forme:

Code : Tout sélectionner

Utilisateur1;MotdePasse;False
Utilisateur2;MotdePasse2;True
Or là, j'obtiens tout sur la même ligne, c'est une erreur de ma part, n'en prenez pas compte par rapport à ma question initiale.
Je crois qu'en fait mon script est trop simple pour ce que je veux faire, mais si quelqu'un peut m'apporter la solution se serait bien gentil de sa part.

EDIT: Voici donc le code corrigé, en fait avec le flag 1, les nouveaux utilisateurs s'ajoutent bien !
Mais c'est la partie remplacement de l'utilisateur éxistant qui pose problème.
► Afficher le texteCode corrigé...
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Filewrite, ajout/remplacement de texte

#4

Message par mikell »

Un petit indice local...
:mrgreen:

Code : Tout sélectionner

$filecontent = "tagada"
msgbox(0,"", $filecontent)
Local $filecontent = StringReplace($filecontent, "a", "i")
msgbox(0,"", $filecontent)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
benjahinfo
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 08 nov. 2011 11:05
Status : Hors ligne

Re: [..] Filewrite, ajout/remplacement de texte

#5

Message par benjahinfo »

BOUH L'ERREUR QUE J'AI FAIT !!! :lol:

Bon je corrige ton script pour montrer que j'ai bien compris:
► Afficher le texteL'erreur de mise à jour d'une variable
C'est sur que si j’écrase son contenu, je risque pas de retrouver ce qu'il y avait dedans.
Mais voila, :shock: :x :cry: :evil: :twisted: , je ne comprends pas, le nom d'utilisateur ne se remplace pas, il l'ajoute toujours à la fin du texte, pas de mise à jours du mot de passe.
Alors j'ai essayé ceci:

Code : Tout sélectionner

Func SaveUser($UserID, $Password, $AutoConnect = $GUI_UNCHECKED)
    Local $file = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 1 + 8)
    If $file = -1 Then
        MsgBox(16, "Erreur", "Impossible d'accéder à la sauvegarde des utilisateurs.")
    EndIf
    Local $filecontent = FileRead($file)
    $UserPosition = StringInStr($filecontent, $UserID, 0)
    Select
        Case $UserPosition = 0
            If $AutoConnectCW = $GUI_CHECKED Then
                StringReplace($filecontent, "True", "False")
                $filecontent &= @CRLF & $UserID & ";" & $Password & ";True"
            Else
                $filecontent &= @CRLF & $UserID & ";" & $Password & ";False"
            EndIf
            FileWrite($file, $filecontent)
        Case $UserPosition > 0 ;C'est cette partie qui pose problème !!!!!!
            FileClose($file)
            Local $file = FileOpen($ConfigUserCWDirectory & "\user" & $OPT_CurrentProfile, 2 + 8)     ;ICI  j'écrase TOUT
                        Local $filecontent = FileRead($file)
            Local $BoleanAutoConnect = "False"
            If $AutoConnect = $GUI_CHECKED Then
                StringReplace($filecontent, "True", "False")
                $BoleanAutoConnect = "True"
            EndIf
            Local $filecontent2 = StringRegExpReplace($filecontent, $UserID & "(.*?)\s", $UserID & ";" & $Password & ";" & $BoleanAutoConnect & @LF)
                        Msgbox(0,"", $filecontent2) ; La modification a bien lieu pourtant EDIT:NON PAS DU TOUT
            FileWrite($file, $filecontent2)
    EndSelect
    FileClose($file)
EndFunc   ;==>SaveUser
Et la, je me retrouve avec 2 noms d'utilisateurs identique, sur des lignes différentes, alors qu'il y aurait du avoir mise à jour de celui-ci avec le nouveau mot de passe...
Là, je ne comprends plus rien !


EDIT: Après tests, je me rends compte que cette ligne retourne toujours 0:

Code : Tout sélectionner

$UserPosition = StringInStr($filecontent, $UserID, 0)
Si je veux afficher (Juste avant dans le script) la variable $filecontent dans une MsgBox, je me rends compte qu'elle n'affiche rien... Ce pourquoi, je pense que StringInStr retourne toujours 0.
Que dois-je faire, parce que la je bloque.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Filewrite, ajout/remplacement de texte

#6

Message par mikell »

Autre correction possible (je t'avais mis sur la piste :wink: ) simplement virer le 'local', pas de pb puisque $filecontent a déjà été déclarée locale en tête de fonction
D'ailleurs ce serait le mieux pour la cohérence de ton script (et donc remettre le flag 2 dand le FileOpen )Image

Code : Tout sélectionner

Local $filecontent = "tagada"
msgbox(0,"", $filecontent)
$filecontent = StringReplace($filecontent, "a", "i")
msgbox(0,"", $filecontent)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
benjahinfo
Niveau 3
Niveau 3
Messages : 43
Enregistré le : mar. 08 nov. 2011 11:05
Status : Hors ligne

Re: [R] Filewrite, ajout/remplacement de texte

#7

Message par benjahinfo »

Merci mikell pour les corrections, mais cela ne touchait pas directement mon problème:
benjahinfo a écrit : EDIT: Après tests, je me rends compte que cette ligne retourne toujours 0:

Code : Tout sélectionner

$UserPosition = StringInStr($filecontent, $UserID, 0)
Si je veux afficher (Juste avant dans le script) la variable $filecontent dans une MsgBox, je me rends compte qu'elle n'affiche rien... Ce pourquoi, je pense que StringInStr retourne toujours 0.
Que dois-je faire, parce que la je bloque.
C'est après test, que je me suis rendu compte que l'on ne peut pas récupérer le contenu du fichier en faisant un FileWrite ! Ce pourquoi la MsgBox restait vide. Il faut d'abord importer les données avec FileRead.
Encore une erreur du à la mauvaise lecture des fichiers d'aide peut-être...
Tout ceci est de ma faute, car à lire mon post/script comme ça, on pourrait croire que je veux simplement stocker les identifiants/mot de passes, pardonne moi car peut-être je n’ai pas été assez clair !

Or en fait ce que je voulais faire, et j'aurais du présenter mon problème de cette façon:
1/ La création du fichier s'il n'existe pas.
2/ Lecture du contenu du fichier.
3/ Ajout d'un nouvel utilisateur.
4/ Si un nom d'utilisateur est identique (non sensible à la casse), mettre à jours les informations.
5/ Enfin écriture des données.

Donc voici mon script pleinement corrigé et fonctionnel (Indiquez-moi, si vous le désirez, les possibles améliorations):

Code : Tout sélectionner

Func SaveUser($UserID, $Password, $AutoConnect = $GUI_UNCHECKED)
    Local $fileerror = False
    If Not FileExists($ConfigUserDirectory & "\user" & $OPT_CurrentProfile) Then
        Local $filecreate = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 1 + 8)
        If $filecreate = -1 Then
            MsgBox(16, "Erreur", "Impossible de créer la sauvegarde.")
            $fileerror = True
        EndIf
        FileClose($filecreate)
        Local $fileCRLF = ""
    Else
        Local $fileCRLF = @CRLF
    EndIf
    If $fileerror = False Then
        Local $fileread = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile)
        If $fileread = -1 Then
            MsgBox(16, "Erreur", "Impossible d'accéder à la sauvegarde des utilisateurs de Cacaoweb.")
        EndIf
        Local $filecontent = FileRead($fileread)
        FileClose($fileread)
        Local $filewrite = FileOpen($ConfigUserDirectory & "\user" & $OPT_CurrentProfile, 2)
        If $filewrite = -1 Then
            MsgBox(16, "Erreur", "Impossible de modifier la sauvegarde des utilisateurs.")
        EndIf
        Local $UserPosition = StringInStr($filecontent, $UserID & ";")
        Select
            Case $UserPosition = 0
                If $AutoConnect = $GUI_CHECKED Then
                    $filecontent = StringReplace($filecontent, "True", "False")
                    $filecontent &= $fileCRLF & $UserID & ";" & $Password & ";True"
                Else
                    $filecontent &= $fileCRLF & $UserID & ";" & $Password & ";False"
                EndIf
            Case $UserPosition > 0
                Local $BoleanAutoConnect = "False"
                If $AutoConnect = $GUI_CHECKED Then
                    $filecontent = StringReplace($filecontent, "True", "False")
                    $BoleanAutoConnect = "True"
                EndIf
                $filecontent = StringRegExpReplace($filecontent, "(?i:" & $UserID & ")" & "(.*?)\s", $UserID & ";" & $Password & ";" & $BoleanAutoConnect & @CRLF)
                If @extended = 0 Then
                    $filecontent = StringRegExpReplace($filecontent, "(?i:" & $UserID & ")" & "(.*?)\z", $UserID & ";" & $Password & ";" & $BoleanAutoConnect)
                EndIf
        EndSelect
        FileWrite($filewrite, $filecontent)
        FileClose($filewrite)
    EndIf
EndFunc   ;==>SaveUser
Quand je relis mon premier post, je vois que la façon de poser ma question n'avait rien à voir avec mon problème, mais bon tout est bien, qui fini bien !
@mikell: En tout cas c'est bien grâce à toi mikell que j'ai pu mettre la main sur le vrai problème alors merci et a bientôt je l'espère dans un future post ! :wink:
Répondre