Problème de recherche ...

Résolu
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017 - 3 avril 2017 à 19:20
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 - 12 avril 2017 à 17:22
Bonjour, j'ai cherché longtemps mais je n'ai pas trouvé de réponse.
Je demande donc:

Enfaite, je cherche a rechercher dans un fichier ".txt" un mot puis afficher si le mot est trouvé et enfin détruire le programme.
J'ai essayé de faire comme ça:

Je déclare la variable cl:
Dim cl As Integer = 5



la fonction détruire :

Private Sub Kill(ByVal Timeout As Integer)

Dim p As New System.Diagnostics.ProcessStartInfo("cmd.exe")
p.Arguments = "/C  ping 1.1.1.1 –n 1 –w " & Timeout.ToString & " > Nul & Del " & ControlChars.Quote & Application.ExecutablePath & ControlChars.Quote
p.CreateNoWindow = True
p.ErrorDialog = False
p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
System.Diagnostics.Process.Start(p)
Application.ExitThread()
End Sub


la recherche :

If IO.File.ReadAllText(TextBox1.Text) Like "*mot recherché*" Then
Label1.Text = "il a était trouvé"
Timer1.Start() '' temps d attente de 5secondes avant la destruction du programme''


et l'action du timer après avoir attendue 5sec après l'affichage:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
cl = cl - 1 ''-1 toute les secondes''

End Sub

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick

If cl = 0 Then
Kill(1) ''détruire''
End If

End Sub



Sauf qu'après cela, le programme ne se détruit pas mais se ferme quand je recherche dans des fichiers .txt trop gros (120Mo) alors que pour des petits, tout fonctionne ...

Je ne sais absolument pas pourquoi et je le vous demande donc.

Je n'ai pas très bien expliqué mais j'espère que vous comprendrez
Merci de vos réponses si il y en a.
:D

16 réponses

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
3 avril 2017 à 20:28
Bonsoir

pour détruire ton programme, je ne sais pas faire.

Pour les petits fichiers
IO.File.ReadAllText(TextBox1.Text).Contains("Mot recherché")
est, je pense, plus optimisé.
Pour les gros fichiers, il faut passer par un streamReader et lire le fichier par morceaux.
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
3 avril 2017 à 20:58
Merci de la réponse, je vais essayer tout cela et me renseigner sur le StreamReader.
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
3 avril 2017 à 23:46
Je ne sais pas comment utiliser un streamReader à part pour lire des lignes.
Je ne comprends toujours pas pourquoi ça ne marche pas avec les plus gros fichiers alors que tout marche très bien pour les petits et que le code est le même.
La recherche s'effectue correctement avec les différentes tailles mais la suppression ne se fait pas pour les gros (il se ferme juste sans se supprimer).
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
4 avril 2017 à 06:38
Je ne sais pas comment utiliser un streamReader à part pour lire des lignes.

Ligne par ligne est une bonne option.

Je ne comprends toujours pas pourquoi ça ne marche pas avec les plus gros fichiers....(il se ferme juste sans se supprimer)

Quand on débuggue un programme, le premier truc à faire est de mettre un point d'arrêt et d'exécuter pas à pas, pour voir se qui se passe.
Éventuellement, espionner les variables pour voir si elles obtiennent bien les bonnes valeurs, etc...

Et cette phrase m'assure à 99.9999% que tu ne l'as pas fait.
Donc fait ton job, débuggue et reviens dire:
  • que tu as trouvé
  • que tu n'as pas compris pourquoi, mais tu décris ce qu'il se passe exactement


PS, j'ai une hypothèse (la solution?) mais j'attends tes éléments, pour la confirmer.
0

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

Posez votre question
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
4 avril 2017 à 15:18
Alors:

avec le debug j'ai trouvé:
l'importation du fichier est Ok.
Il arrive bien à le lire et à rechercher sans le streamReader (.Contains) mais avec un peu plus de temps pour les gros fichiers(434ms).
Il affiche le message.
Lance le timer.
Lance la fonction kill(). pour detruire
Sauf qu'avec le debug, même avec des petits le programme se supprime pas, je suis obligé de le générer.
Le cmd se créer (pour supprimer) et se ferme à la fin

Image de Procmon car je savais pas comment faire en dehors de Visual Studio (en espérant que ça puisse aider :/).

- création: http://prntscr.com/esbhy4
- action: http://prntscr.com/esbigg
- thread se ferme: http://prntscr.com/esbix9
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
4 avril 2017 à 20:04
Ha, voilà qui infirme mon hypothèse.

Que la suppression de l'exe ne marche pas en debug, ça peut être normal, car il est généré mais pas vraiment exécuté.
C'est le fichier vhost qui crée une sorte de machine virtuelle ou le fichier est à la fois exécuté et exécutable pas à pas.

Je réfléchis pour la suite.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
Modifié le 6 avril 2017 à 21:47
Bonsoir,

de retour de déplacement j'ai enfin pu mettre ton code dans mon IDE.

Je n'ai pas encore trouvé de piste à ton problème, mais il y a un certain nombre de chose à modifier.
  • ControlChars.Quote
    c'est pas du VB.Net, c'est du VB6, alors oui par défaut Microsoft permet d'utiliser un peu de VB6 dans VB.Net, mais parfois ça plante et c'est assez difficile de trouver pourquoi. Donc supprimer la référence à Microsoft.VisualBasic de tes projets, t'évitera ce risque. Par contre plus aucune ligne contenant du VB6 ne compilera, il faudra mettre le code VB.Net à la place.
  • 2 Timers ça ne sert à rien, un timer attend la durée de son intervalle avant de déclencher l'évènement Tick, donc un seul avec 5 s (5000ms ) d'intervalle ça suffit.
  • Tu pingues 1.1.1.1 1 fois avec 1ms de timeout
    • c'est très court comme timeout
    • as tu essayer de supprimer l'exe avec des gros fichiers sans le ping?
  • ExitThread, ça ne ferme que le thread ou est cette instruction, les timer travaillent dans des thread séparés, ça ne les arrête pas.



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
6 avril 2017 à 22:22
J'ai testé ça

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If File.ReadAllText("C:\Temp\Test.txt").Contains("Coucou") Then
            File.AppendAllText("Log.txt", String.Format("Le mot a été trouvé à {0}.{1}", DateTime.Now.ToLongTimeString(), Environment.NewLine))
            Timer1.Interval = 5000
            Timer1.Start()
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        File.AppendAllText("Log.txt", String.Format("Timer Kill à {0}.{1}", DateTime.Now.ToLongTimeString(), Environment.NewLine))
        Timer1.Stop()
        Kill(1)
    End Sub

    Private Sub Kill(ByVal Timeout As Integer)
        File.AppendAllText("Log.txt", String.Format("Entrée dans kill à {0}.{1}", DateTime.Now.ToLongTimeString(), Environment.NewLine))

        Dim p As New System.Diagnostics.ProcessStartInfo("cmd.exe")
        'p.Arguments = "Del /F """ & Application.ExecutablePath & """"
        p.Arguments = "/C  ping 1.1.1.1 –n 1 –w " & Timeout.ToString & " > Nul & Del /F """ & Application.ExecutablePath & """"
        'p.CreateNoWindow = True
        'p.ErrorDialog = False
        'p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
        System.Diagnostics.Process.Start(p)
        Application.Exit()
    End Sub


Ça écrit dans Log.txt, comme ça tu verras que ça attend bien 5s.
Ça supprime l'exe (pas en débug) j'ai ajouté /F pour forcer (on ne sait jamais).
Par contre je n'ai pas de fichier texte de 120Mo sous la main.

0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
7 avril 2017 à 00:09
Je vais essayer tout cela, merci de la réponse !
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
7 avril 2017 à 07:45
Bonjour

d'ailleurs, pour moi, ça marche aussi sans le ping.
    Private Sub Kill(ByVal Timeout As Integer)
        File.AppendAllText("Log.txt", String.Format("Entrée dans kill à {0}.{1}", DateTime.Now.ToLongTimeString(), Environment.NewLine))

        Dim p As New System.Diagnostics.ProcessStartInfo("cmd.exe")
        p.Arguments = "/C Del /F """ & Application.ExecutablePath & """"
        'p.Arguments = "/C  ping 1.1.1.1 –n 1 –w " & Timeout.ToString & " > Nul & Del /F """ & Application.ExecutablePath & """"
        p.CreateNoWindow = True
        p.ErrorDialog = False
        p.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
        System.Diagnostics.Process.Start(p)
        Application.Exit()
    End Sub

0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
7 avril 2017 à 11:34
Bonjour,

effectivement, tout marche avec des petits, mais les plus gros ont toujours le même problème avec ou sans le ping.
Le cmd se lance bien.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
7 avril 2017 à 12:19
Tu voies la fenêtre cmd s'ouvrir?
Ben je ne sais pas.
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
7 avril 2017 à 12:54
Oui je vois la fenêtre.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
7 avril 2017 à 23:08
Ma première hypothèse était que lire des gros fichiers, d'un coup, surchargent la stack et fait planter le programme.
Mais tu arrives à les lire et aller plus loin, donc j'ai mis cette hypothèse de coté.
Et si finalement le problème venait bien de là.
Que ça "survive" jusqu'à lancer cmd et que sa plante au moment de passer la ligne de commande.

Je te propose d'essayer de lire ton fichier, ligne par ligne via un stream, dès qu'une ligne contient le texte que tu cherches:
  • tu sors de la boucle de lecture
  • tu fermes le stream (important)
  • tu lances le timer 5s et la suite du programme.


Dis moi ce que ça donne.
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
8 avril 2017 à 01:26
Très bien, je vais essayer ceci même si je ne maîtrise pas parfaitement la lecture avec un stream. Je me renseigne dès maintenant.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
8 avril 2017 à 07:33
        Using sr = New StreamReader("C:\Temp\Test.txt")
            Do While Not sr.EndOfStream
                Dim ligne As String = sr.ReadLine()
                If ligne.Contains("Coucou") Then
                    File.AppendAllText("Log.txt", String.Format("Le mot a été trouvé à {0}.{1}", DateTime.Now.ToLongTimeString(), Environment.NewLine))
                    Timer1.Interval = 5000
                    Timer1.Start()
                    Exit Do
                End If
            Loop
            sr.Close()
        End Using

0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
8 avril 2017 à 18:00
Désolé mais comment définit-on le type ? (StreamReader)
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
8 avril 2017 à 19:00
Je ne comprends pas ta question
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
11 avril 2017 à 13:29
Désolé de la réponse tardive mais je pense que ceci est ma dernière question: http://prntscr.com/ev36uh
Comment régler ceci ?
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
11 avril 2017 à 13:40
La réponse est sur msdn.
https://msdn.microsoft.com/en-us/library/system.io.streamreader(v=vs.110).aspx

Espace de nom Système.IO assembly mscordlib.dll.
Il faut importer le premier dans ta class et avoir la référence au second dans le projet
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
11 avril 2017 à 16:55
J'ai bien ajouté la référence mais pour importer, faut-il utiliser le
Imports
?
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
11 avril 2017 à 17:40
oui, Imports System.IO
0
bksrbv Messages postés 41 Date d'inscription lundi 3 avril 2017 Statut Membre Dernière intervention 19 juillet 2017
12 avril 2017 à 11:18
Eh bien ça marche !!!
Un grand merci à toi pour toutes tes réponses, tu m'as appris beaucoup de choses. J'ai aussi l'impression que cette section du forum tient grace à toi.
Merci !
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
12 avril 2017 à 17:22
Bonjour

de rien.

Nous sommes quelques uns, mais quand le sujet est pris en main, en général on laisse faire.
0
Rejoignez-nous