Problème de recherche ... [Résolu]

bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 3 avril 2017 à 19:20 - Dernière réponse : Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention
- 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
Afficher la suite 

24 réponses

Répondre au sujet
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 3 avril 2017 à 20:28
0
Utile
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.
Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 3 avril 2017 à 20:58
0
Utile
Merci de la réponse, je vais essayer tout cela et me renseigner sur le StreamReader.
Commenter la réponse de bksrbv
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 3 avril 2017 à 23:46
0
Utile
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).
Commenter la réponse de bksrbv
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 4 avril 2017 à 06:38
0
Utile
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.
Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 4 avril 2017 à 15:18
0
Utile
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
Commenter la réponse de bksrbv
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 4 avril 2017 à 20:04
0
Utile
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.
Commenter la réponse de Whismeril
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - Modifié par Whismeril le 6/04/2017 à 21:47
0
Utile
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
Commenter la réponse de Whismeril
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 6 avril 2017 à 22:22
0
Utile
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.

Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 7 avril 2017 à 00:09
0
Utile
Je vais essayer tout cela, merci de la réponse !
Commenter la réponse de bksrbv
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 7 avril 2017 à 07:45
0
Utile
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

Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 7 avril 2017 à 11:34
0
Utile
2
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.
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 7 avril 2017 à 12:19
Tu voies la fenêtre cmd s'ouvrir?
Ben je ne sais pas.
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 7 avril 2017 à 12:54
Oui je vois la fenêtre.
Commenter la réponse de bksrbv
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 7 avril 2017 à 23:08
0
Utile
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.
Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 8 avril 2017 à 01:26
0
Utile
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.
Commenter la réponse de bksrbv
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 8 avril 2017 à 07:33
0
Utile
        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

Commenter la réponse de Whismeril
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 8 avril 2017 à 18:00
0
Utile
5
Désolé mais comment définit-on le type ? (StreamReader)
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 8 avril 2017 à 19:00
Je ne comprends pas ta question
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 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 ?
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 11 avril 2017 à 16:55
J'ai bien ajouté la référence mais pour importer, faut-il utiliser le
Imports
?
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 11 avril 2017 à 17:40
oui, Imports System.IO
Commenter la réponse de bksrbv
bksrbv 41 Messages postés lundi 3 avril 2017Date d'inscription 19 juillet 2017 Dernière intervention - 12 avril 2017 à 11:18
0
Utile
1
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 !
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 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.
Commenter la réponse de bksrbv

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.