Lire et ajouter des lignes à un fichier texte

Résolu
Utilisateur anonyme - 6 avril 2013 à 22:53
 Utilisateur anonyme - 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 !

19 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
9 avril 2013 à 23:10
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
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 avril 2013 à 23:15
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
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
7 avril 2013 à 01:16
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
---
0
Utilisateur anonyme
9 avril 2013 à 16:55
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.
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
9 avril 2013 à 18:39
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
---
0
Utilisateur anonyme
9 avril 2013 à 21:19
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
0
Utilisateur anonyme
10 avril 2013 à 22:06
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 !
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 avril 2013 à 23:02
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
0
Utilisateur anonyme
11 avril 2013 à 21:09
Salut ShayW,
ton code ci dessus marche très bien ! Plus aucun problème !
Génial merci beaucoup !
0
Utilisateur anonyme
24 avril 2013 à 18:40
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.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
24 avril 2013 à 21:41
Salut

envois ton code pour mieux comprendre l'erreur
0
Utilisateur anonyme
24 avril 2013 à 21:45
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
24 avril 2013 à 22:24
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
0
Utilisateur anonyme
25 avril 2013 à 17:24
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 !
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
25 avril 2013 à 19:59
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
0
Utilisateur anonyme
25 avril 2013 à 20:05
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.
0
Utilisateur anonyme
28 avril 2013 à 21:04
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.
0
Utilisateur anonyme
28 avril 2013 à 21:18
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.
0
Utilisateur anonyme
29 avril 2013 à 12:06
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.
0
Rejoignez-nous