Lire et ajouter des lignes à un fichier texte [Résolu]

CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 6 avril 2013 à 22:53 - Dernière réponse : CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention
- 29 avril 2013 à 12:06
Salut les amis !
Je voudrais développer un petit outil qui permet d'ajouter des lignes au fichier hosts à partir d'un fichier texte. Je voudrais que le logiciel consulte la liste et si la ligne :
127.0.0.1 lesite.quelquechose
est dejà présente dans le fichier hosts, et bien alors il ne l'ajoutera pas. Mais tous les autres sites présents dans le fichier texte et absent dans le fichier hosts sont ajoutés.
Voici le code que j'ai crée en m'inspirant d'un peu partout sur le net :
Try
            Dim StreamReaderHosts As New StreamReader("C:\Windows\System32\Drivers\etc\hosts")
            Dim StreamReaderListe As New StreamReader("C:\Users\Clément\Documents\ListeDeSite.txt")
            Dim ligne As String
            Dim ligneExistante As String = StreamReaderHosts.ReadToEnd
            StreamReaderHosts.Close()
            Dim StreamWriterSautLigne As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
            StreamWriterSautLigne.WriteLine(vbNewLine)
            StreamWriterSautLigne.Close()
            Do
                ligne = StreamReaderListe.ReadLine
                Dim sw As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
                If Not ligneExistante.Contains(ligne) Then
                    sw.WriteLine(ligne)
                    sw.Close()
                End If
            Loop Until ligne Is Nothing
            StreamReaderListe.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try


Le problème de mon code c'est que j'ai plusieurs erreurs :
La première c'est que
la valeur ne peut pas être null.
. L'erreur est de type
System.ArgumentNullException
.

La deuxième erreur est que
le fichier hosts est en cours d'utilisation par un autre processus.
J'ai pourtant vérifié et je pense close le hosts au bon endroit

Troisième problème, c'est si aucune ligne de ma liste n'est présente dans le hosts, elles s'ajoutent toutes parfaitement alors que si une est présente dans la liste et dans le hosts mais qu'il en reste une ou plusieurs à mettre dans le hosts et bien elles ne s'ajoutent pas.

Voilà si vous pouvez me donner un petit coup de main !
Merci !
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 9 avril 2013 à 23:10
3
Merci
Salut

à tester
Try
Dim StreamReaderHosts As New StreamReader("C:\Windows\System32\Drivers\etc\hosts")
  Dim StreamReaderListe As New StreamReader("C:\Users\Clément\Documents\ListeDeSite.txt")
Dim ligne As String
Dim ligneExistante As String = StreamReaderHosts.ReadToEnd
StreamReaderHosts.Close()
Dim sw As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
 Do
     ligne = StreamReaderListe.ReadLine
     'on verifie si ligne n'est pas vide 
     If ligne = String.Empty Then
        sw.Close()
        Exit Do
      End If
      If Not ligneExistante.Contains(ligne)    Then
        sw.WriteLine(ligne)
      End If
 Loop Until ligne Is Nothing
  StreamReaderListe.Close()
  Catch ex As Exception
      MessageBox.Show(ex.ToString)
End Try

Merci cs_ShayW 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_ShayW
Meilleure réponse
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 10 avril 2013 à 23:15
3
Merci
ou encore une autre solution
Private Sub test()
   Dim list1, list2 As New List(Of String)
   Try
       list1 = File.ReadAllLines("C:\Windows\System32\Drivers\etc\hosts").ToList
       list2 = File.ReadAllLines("C:\Users\Clément\Documents\ListeDeSite.txt").ToList
    For Each element In list2
       If Not list1.Contains(element) Then
            list1.Add(element)
        End If
     Next
            File.WriteAllLines("C:\Windows\System32\Drivers\etc\hosts", list1.ToArray)
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub

Merci cs_ShayW 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_ShayW
NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscription 22 septembre 2018 Dernière intervention - 7 avril 2013 à 01:16
0
Merci
Bonjour,

Io.File.AppendText c'est pas lus pratique ?

Sur quelles lignes ces erreurs ?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Commenter la réponse de NHenry
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 9 avril 2013 à 16:55
0
Merci
Salut,
la première erreur est sur la ligne :
If Not ligneExistante.Contains(ligne) Then
.
La deuxième erreur est sur la ligne :
Dim StreamReaderHosts As New StreamReader("C:\Windows\System32\Drivers\etc\hosts")


Que veux-tu dire par utiliser un append (je connais cette fonction) mais ce que je veux dire c'est comment l'utiliserait-tu ? A la place de mon Do ... ?
Merci de ton aide Henry.
Commenter la réponse de CLeBeR_FR
NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscription 22 septembre 2018 Dernière intervention - 9 avril 2013 à 18:39
0
Merci
Bonjour,

Voir :
http://msdn.microsoft.com/fr-fr/library/ms143356%28v=vs.80%29.aspx

Io.File.AppendAllText("C:\Windows\System32\Drivers\etc\hosts","127.0.0.1 ...")

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Commenter la réponse de NHenry
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 9 avril 2013 à 21:19
0
Merci
Salut Henry,
j'ai procédé avec la fonction que tu m'a conseillé, effectivement ça marche aussi pour le premier coup c'est à dire si j'ajoute une fois tous les éléments d'une liste, tout se passe bien les sites sont bloqués ... Cependant, si j'ajoute une ligne dans ma ListeDeSite, le ou les derniers sites s'ajoutent correctement mais avec un saut de 3 lignes et donc ils ne sont pas bloqués.
Alors d'après moi, il faut que ce code :
            Dim StreamWriterSautLigne As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
            StreamWriterSautLigne.WriteLine(vbNewLine)
            StreamWriterSautLigne.Close()
ne s'exécute qu'une seule fois juste pour séparer le premier site du
127.0.0.1 localhost

puis il faudrait que le dernier site ajouté annule cette action
Environment.NewLine
et d'après moi, cela résoudrait le problème de 3 sauts de ligne.
Tu en penses quoi ?
        Try
            Dim StreamReaderHosts As New StreamReader("C:\Windows\System32\Drivers\etc\hosts")
            Dim StreamReaderListe As New StreamReader("C:\Users\Clément\Documents\ListeDeSite.txt")
            Dim ligne As String
            Dim ligneExistante As String = StreamReaderHosts.ReadToEnd
            StreamReaderHosts.Close()
            Dim StreamWriterSautLigne As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
            StreamWriterSautLigne.WriteLine(vbNewLine)
            StreamWriterSautLigne.Close()
            Do
                ligne = StreamReaderListe.ReadLine

                'Dim sw As StreamWriter = New StreamWriter("C:\Windows\System32\Drivers\etc\hosts", True)
                If Not ligneExistante.Contains(ligne) Then
                    IO.File.AppendAllText("C:\Windows\System32\Drivers\etc\hosts", ligne + Environment.NewLine)
                    'sw.Close()
                End If
            Loop Until ligne Is Nothing
            StreamReaderListe.Close()
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
Commenter la réponse de CLeBeR_FR
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 10 avril 2013 à 22:06
0
Merci
Salut ShayW,
ton code résout le problème des messages box ainsi que des espaces ! Seul petit problème, la première ligne ajoutée la toute première fois est sur la même ligne que la dernière ligne du fichier hosts. Cependant j'ai pensé à une solution, je fais un StreamWriter qui écris une ligne vide (VbNewLine) et en même temps un fichier texte dans un répertoire quelconque. Le programme avant d'ajouter les lignes vérifie si le fichier texte existe, si oui il n'écrit pas la ligne vide, si non il l'écrit. Je ferai le code quand j'aurai le temps, surement demain puis je le posterai. Si vous avez une idée plus logique et plus simple je suis preneur !
Merci encore !
Commenter la réponse de CLeBeR_FR
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 10 avril 2013 à 23:02
0
Merci
Salut
Seul petit problème, la première ligne ajoutée la toute première fois est sur la même ligne que la dernière ligne du fichier hosts


bizarre je n'ai pas eu ce problème
Commenter la réponse de cs_ShayW
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 11 avril 2013 à 21:09
0
Merci
Salut ShayW,
ton code ci dessus marche très bien ! Plus aucun problème !
Génial merci beaucoup !
Commenter la réponse de CLeBeR_FR
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 24 avril 2013 à 18:40
0
Merci
Salut Shayw,
je voudrais revenir sur le dernier code que tu m'as passé, car je suis actuellement sur le projet et j'ai besoin de ce code.
J'ai l'erreur : 'ToList' n'est pas un membre de 'System.Array'
Je ne comprends pas pourquoi, peux tu m'expliquer ?
Merci.
Commenter la réponse de CLeBeR_FR
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 24 avril 2013 à 21:41
0
Merci
Salut

envois ton code pour mieux comprendre l'erreur
Commenter la réponse de cs_ShayW
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 24 avril 2013 à 21:45
0
Merci
C'est celui que tu m'as passé :
Private Sub test()
   Dim list1, list2 As New List(Of String)
   Try
       list1 = File.ReadAllLines("C:\Windows\System32\Drivers\etc\hosts").ToList
       list2 = File.ReadAllLines("C:\Users\Clément\Documents\ListeDeSite.txt").ToList
    For Each element In list2
       If Not list1.Contains(element) Then
            list1.Add(element)
        End If
     Next
            File.WriteAllLines("C:\Windows\System32\Drivers\etc\hosts", list1.ToArray)
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub
Commenter la réponse de CLeBeR_FR
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 24 avril 2013 à 22:24
0
Merci
tu avais écrit dans le post précedent que le code
marchait
l'avais tu testé
je ne vois pas l'erreur puisque chez moi je n'ai
pas d'erreur
possible que je code avec le framework 3.5 (vb2008) et qu'avec les versions ultérieurs
c'est différent
peut etre ainsi je n'ai pas testé en runtime
je n'ai pas d'erreur de compilation

Private Sub test()
   Dim list1(), list2() As String
    Try
       list1 = File.ReadAllLines("C:\Windows\System32\Drivers\etc\hosts")
       list2 = File.ReadAllLines("C:\Users\Clément\Documents\ListeDeSite.txt")
    For Each element In list2
       If Not list1.Contains(element) Then
                    list1.ToList.Add(element)
       End If
    Next
            File.WriteAllLines("C:\Windows\System32\Drivers\etc\hosts", list1)
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
   End Try
End Sub
Commenter la réponse de cs_ShayW
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 25 avril 2013 à 17:24
0
Merci
Salut,
oui je l'avais testé et il marchait mais comme tu l'as dit, c'est un problème de Framework, comme j'ai crée mon projet sous le Framework 2.0 pour qu'il marche sur tous les PC, cette fonction n'était pas prise en charge !
Merci encore !
Commenter la réponse de CLeBeR_FR
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 25 avril 2013 à 19:59
0
Merci
Salut
tu l'avais testé sous quel framework ?


c'est un problème de Framework, comme j'ai crée mon projet sous le Framework 2.0 pour qu'il marche sur tous les PC


tu devrais dévelloper avec le framework le plus
récent étant à ta disposition
Commenter la réponse de cs_ShayW
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 25 avril 2013 à 20:05
0
Merci
Je l'avais testé sur le Framework 4.5 me semble t-il. Je sais mais au moins je suis sur que le programme marchera sur n'importe quel PC, même si il n'est pas à jour.
Commenter la réponse de CLeBeR_FR
Utilisateur anonyme - 28 avril 2013 à 21:04
0
Merci
Je l'avais testé sur le Framework 4.5 me semble t-il. Je sais mais au moins je suis sur que le programme marchera sur n'importe quel PC, même si il n'est pas à jour.


Tu as juste à faire un déploiement avec ClickOnce. Il y a une étape pour ajouter le Framework au package d'installation.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 28 avril 2013 à 21:18
0
Merci
Parce que maintenant, en plus de fournir le code gratuitement, il faut demander au monsieur pour quel Framework il le veut et le faire pour ce Framework-là et pas un autre. Pourquoi pas le Framework 1.0 Beta, tant qu'à y être ? Ce n'est pas le problème des répondeurs du forum de fournir un code universel gratuit. Ceux qui n'ont pas évolué depuis le Framework 1.0, c'est leur problème, pas le nôtre. Je ne sais pas pour qui ni pourquoi tu as réquisitionné ce code-là et gratuit en plus; mais c'est ton problème de faire évoluer tes clients et pas à nous de faire ton travail.
Commenter la réponse de Utilisateur anonyme
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 27 février 2018 Dernière intervention - 29 avril 2013 à 12:06
0
Merci
Tu te prends pour qui a parler avec un ton agressif comme tu le fait ? Si il y en a bien un qui peut se plaindre c'est ShayW qui m'a gentillement aidé contrairement à toi qui vient juste pour mettre des commentaires inutiles. De plus nous sommes sur un forum d'entraide graduite donc les membres proposent gentillement de l'aide gratuitement, si tu n'es pas dans cette logique tu n'as rien a faire ici.
Commenter la réponse de CLeBeR_FR

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.