Comprend pas ! et vous ?

Résolu
Tyrell2 Messages postés 251 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 novembre 2010 - 22 janv. 2009 à 14:18
Tyrell2 Messages postés 251 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 novembre 2010 - 23 janv. 2009 à 21:38
bonjour,
excusez moi de creer un nouveau poste pour ça, mais c'est pour etre plus attractif because je seche et je commence à avoir la pression...
je veux modifier la 1ere ligne d'un fichier ini mal formaté (il  ne commence pas par une etiquette) donc je ne peux pas (ou n'arrive pas ?) utiliser l'API
WritePrivate ProfilString

J'ai donc adapté un code trouvé avec Google et le remplacement du mot fonctionne bien,
seulement maintenant, une ligne vide est ajouté au debut du nouveau fichier INI et je n'ai pas la moindre idée de pourquoi .

pouvez me donner votre avis svp ?  merci d'avance.

voici le code que j'utilise mais je ne trouve pas la faille . HELP !

Imports System.IO

Imports

System.Text.RegularExpressions
Imports

System.IO.Path
Public

Class
Form1

Private
SubButton1_Click( ByValsender AsSystem.Object, ByVale AsSystem.EventArgs) HandlesButton1.Click

Dim
rech AsString= Remplace( "C:\Temp\test.ini", "tata", "TOTO")

'cr,ation d'un flux sp,cifique pour l',criture

Dim
flux2 AsNewSystem.IO.StreamWriter( "C:\Temp\test.ini", False)

',criture de la chaŒne modif,e sur le flux flux2.Write(rech)

flux2.Close()

End

End
Sub

Public
FunctionRemplace( ByValnomfic AsString, ByValtxtExpReg AsString, ByValtxtReplace AsString) AsString

'd,claration des variables contenant les actions sur les expressions r,guliŠres

Dim
Flux AsNewSystem.IO.StreamReader(nomfic)

Dim
tout AsString

Dim
re AsNewRegex(txtExpReg)

Dim
renvoi AsString= Nothing

Do
tout = Flux.ReadLine

'la chaine renvoi contient les remplacement effectu,es dans le flux par la m,thode Replace() sur l'objet re de la classe Regex
renvoi = renvoi & vbNewLine & re.Replace(tout, txtExpReg, txtReplace)

Loop
WhileFlux.Peek <> -1 Remplace = renvoi

Flux.Close()

End
Function End

Class

_____________
 (débutant inside)

6 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
22 janv. 2009 à 14:48
Salut,

Moi je comprends très bien pourquoi tu te retrouve avec une ligne vierge au début du fichier rien quand regardant le code.

Dans la fonction Remplace avant la boucle Do ... Loop While, tu déclares et initialises la variablerenvoi avec une chaîne vide.

Et c'est là qu'est le problème, en effet, en faisant :


renvoi = renvoi & vbNewLine & re.Replace(tout, txtExpReg, txtReplace)




sur la 1° boucle de Do ... Loop While, cela équivaut à :


renvoi = "" & vbNewLine & re.Replace(tout, txtExpReg, txtReplace)




Je pense que tu as compris, tu as une chaîne vide et tu rajoutes ensuite vbNewLine, ce qui fait que tu as une ligne vierge au début du fichier.


<hr size="2" width="100%" />


La solution est de rajouter une condition sur la valeur de

renvoi

dont l'algorithme est le suivant
:

Si renvoi chaîne vide alors
    renvoi = renvoi + la chaîne modifiée
Sinon
    renvoi = renvoi + Saut de ligne + la chaîne modifiée
Fin Si


<hr size="2" width="100%" />
Note 1 : Remplace vbNewLine par Environment.NewLine

Note 2 : Tu peux simplifier ton code en te passant de certaines variables qui semble superflu...

<hr size ="2" width="100%" />
++

Fauve



<hr size="2" width="100%" />
Pensez : Réponse Acceptée 
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
22 janv. 2009 à 23:34
Salut,

1° Dans le Do ...  Loop While, tu peux remplacer :


   re.Replace(tout, txtExpReg, txtReplace)

   Par
  
  
Regex.Replace(
Flux.ReadLine
, txtExpReg, txtReplace)




   Et du coup, tu peux supprimer dans la fonction Remplace les lignes suivantes :

      Dim tout As String
     
      tout = Flux.ReadLine

      Dim re As New Regex(txtExpReg)

2° Dans la procédure Button1_Click, tu peux remplacer :

  
flux2.Write(rech)

   par

  
flux2.Write(

Remplace(


"C:\Temp\test.ini"

,

"tata"

,

"TOTO"
)
)

   Et du coup, tu peux supprimer dans la procédure Button1_Click la ligne suivante :

     
Dim rech As String = Remplace( "C:\Temp\test.ini", "tata", "TOTO"

++

Fauve

<hr size="2" width="100%" />
Pensez : Réponse Acceptée 
3
Tyrell2 Messages postés 251 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 novembre 2010
22 janv. 2009 à 15:58
1/ merci beaucoup pour ton coup de main > cela fonctionne effectivement bcp mieux avec la condition if !
2/ la preuve que j'ai eu raison de créer un nouveau post
3 /quelles sont les variables qui te semblent superflues stp ?

_____________
 (débutant inside)
0
Tyrell2 Messages postés 251 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 novembre 2010
23 janv. 2009 à 15:31
et bingo ! encore une bonne réponse du fauve   effectivement ça alllege... merci

seul truc qui passe pas : si je remplace 
flux2.Write(rech)

   par 
flux2.Write(Remplace(
"C:\Temp\test.ini", "tata", "TOTO"))

et donc que je supprime dim rech=...

j'ai l'erreur  "processus ne peut pas acceder à fichier test.ini car est en cours d'utilisation"

allez une derniere question et j'arrete de t'embeter (peut-etre....)
pourquoi preferes tu Environment.NewLine à vbNewLine stp ?

____________
 (débutant inside)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
23 janv. 2009 à 18:26
Salut,

Tu obtiens l'erreur "processus ne peut pas accéder à fichier test.ini car est en cours d'utilisation" car tu retournes la valeur de la variable renvoi
avant d'avoir fermé le fichier (



flux.Close()

) donc tu as Flux et Flux2 qui accède au même fichier d'où l'erreur.

La solution, il faut intervertir les lignes suivantes :






     Remplace = renvoi

     et


     Flux.Close()



De façon a fermé le fichier avant de retourner la valeur de la variable renvoi




Ensuite, il faut utiliser Environment.NewLine car tu codes en VB.NET or vbNewLine est issu de VB6. En utilisant vbNewLine, tu obtiendrais la même chose qu'avec Environment.NewLine mais autant faire un code entièrement .NET

++

Fauve

<hr size ="2" width="100%" />
Pensez : Réponse Acceptée 
0
Tyrell2 Messages postés 251 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 novembre 2010
23 janv. 2009 à 21:38
bien compris !
merci

_____________
 (débutant inside)
0
Rejoignez-nous