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 !
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
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
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 ---
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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 ---
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
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 !
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.
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
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
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 !
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.
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.
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.
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.