Chercher un mot dans les fichiers d'un dossier

Résolu
flamouth1 Messages postés 10 Statut Membre -  
 Utilisateur anonyme -
Bonjour, Débutant en visual basic, je cherche à réaliser une application pour mon magasin qui chercherai dans le dossier préalablement choisit, un code contenu dans un des fichiers .txt.

Pour le moment j'ai une form avec:
-un bouton source(localiser le fichier) et charge dans la richtextbox
-un bouton rechercher(cherche le code précisé dans la textbox) et surligne dans la richtextbox
-un bouton Sauvegarder(pour sauvegarder la richtextbox dans le fichier).

Ca fonctionne bien mais pour ne pas avoir à chercher dans tous les fichiers du dossier.

J'ai donc rajouter un bouton pour sélectionner le dossier. Et la je ne trouve rien que je comprenne le fonctionnement sur internet.

Pour le test, mon dossier contient 3 fichiers .txt avec chacun une liste de code.

Je voudrai chercher (par exemple) le code 150234 (définit dans la textbox) et ensuite ouvrir le .txt qui contient le code dans la richtextbox.

Je pourrai donner l'ensemble de la source si cela intéresse d'autre personnes.

Merci d'avance pour votre aide.
Bonne Année :-)

10 réponses

  1. Utilisateur anonyme
     
    Bonjour,
    quel VB?
    • VBS
    • VBA
      • Word
      • Excel
      • Access
      • Powerpoint
      • Autre
    • VB6
    • VB.Net
      • Winform
      • WPF


    0
  2. flamouth1 Messages postés 10 Statut Membre
     
    Je suis en Application Windows Form sous visual studio 2013.
    Voila mon code pour situer un peu.
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
    
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim openMe As New OpenFileDialog()
            Dim selectedFile As String = String.Empty
    
            If openMe.ShowDialog() = Windows.Forms.DialogResult.OK Then
                RichTextBox1.LoadFile(openMe.FileName, RichTextBoxStreamType.PlainText)
                selectedFile = openMe.FileName
                SourceTextbox.Text = selectedFile
    
            Else
    
            End If
    
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            System.IO.File.WriteAllText(SourceTextbox.Text, RichTextBox1.Text)
    
        End Sub
    
        Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
    
        End Sub
    
        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles SourceTextbox.TextChanged
    
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    
            Dim i, j As System.Int32
            Dim strTexte As String = String.Empty
            Dim strChaine As String = String.Empty
    
            strTexte = RichTextBox1.Text
            strChaine = SearchTextBox.Text
    
            For i = 0 To strTexte.Length - strChaine.Length Step 1
                If strTexte.Substring(i, strChaine.Length) = strChaine Then
                    j += 1
                    RichTextBox1.Select(i, strChaine.Length)
                    RichTextBox1.Focus()
                    RichTextBox1.SelectionStart = i
                    RichTextBox1.SelectionLength = strChaine.Length
                End If
            Next
        End Sub
    
        Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles SearchTextBox.TextChanged
    
    
        End Sub
    
        Private Sub Dossier_Click(sender As Object, e As EventArgs) Handles Dossier.Click
    
            Dim selectedos As String = String.Empty
            FolderBrowserDialog1.Description = "Veuillez sélectionner le dossier de recherche."
            FolderBrowserDialog1.ShowNewFolderButton = False
            FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.SpecialDirectories.Desktop
    
            If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                Dim dossier_selectionner As String = FolderBrowserDialog1.SelectedPath
                selectedos = FolderBrowserDialog1.SelectedPath
                DossierTextBox.Text = selectedos
            Else
               
            End If
    
        End Sub
    
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            
        End Sub
    
        Private Sub DossierTextBox_TextChanged(sender As Object, e As EventArgs) Handles DossierTextBox.TextChanged
    
        End Sub
    End Class
    


    Merci
    0
  3. Utilisateur anonyme
     
    Pour récupérer la liste des fichiers d'un répertoire, il faut utiliser la classe Directory et sa méthode de classe GetFiles.
    https://docs.microsoft.com/fr-fr/dotnet/api/system.io.directory.getfiles?redirectedfrom=MSDN&view=netframework-4.8

    Selon la surcharge tu peux spécifier un pattern à chercher et s'il faut chercher dans les sous répertoires.

    Ça va te retourner un tableau avec les chemins de tous les fichiers.

    Il va te falloir tous les ouvrir (avec une boucle foreach par exemple) et File.ReadAllText, et chercher si le texte contient ton code, avec la méthode Contains (attention à la casse) de string.

    A chaque fois que tu trouves le code tu ajoutes le chemin du fichier dans une Liste de String, et une fois fini, tu peux afficher tous les fichier contenant ton code.
    Private Function FichiersContenantTexte(ByVal Repertoire As String, ByVal TexteATrouver As String) As List(Of String)
       Dim resultat As New List(Of String)()
    
       For Each fichier As String In Directory.GetFiles(Repertoire,"*.txt",SearchOption.TopDirectoryOnly)
        If File.ReadAllText(fichier).Contains(TexteATrouver) Then
         resultat.Add(fichier)
        End If
       Next fichier
    
       Return resultat
    End Function


    Pour ce bout de code, je ne tiens pas compte de la casse ni des accents, cédilles, etc...

    Ça peut être réduit avec une requête Linq.

    PS, je n'ai pas lu ton code.
    Quand j'étais petit, la mer Morte n'était que malade.
    George Burns
    0
    1. Utilisateur anonyme
       
      Ha tiens, y'a un bogue dans la coloration syntaxique.
      0
  4. flamouth1 Messages postés 10 Statut Membre
     
    Ok merci c'est beaucoup plus clair pour moi. Je te tiens au jus :-)

    Ps: c'est pas grave c'est brouillon pour le moment ^^.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. flamouth1 Messages postés 10 Statut Membre
     
    Du coup je n'arrive pas à l'associer avec mon bouton pour lancer la recherche du code inscrit dans la textbox. Et ouvrir du coup le resultat dans la richtextbox. Je suis sur qu'il n'y aura pas de doublon.

    Enfin dans l'idée c'est clair mais la pratique beaucoup moins. Je suis vraiment débutant et apprend des sources que je trouve pour satisfaire mon application.

    Si tu pouvais m'aider à l'implémenter, se serai super. Sinon j'ai trouvé une solution alternative mais beaucoup moins pratique. Donc te sens pas obligé. Ca aidera aussi d'autre personne d'avoir un code complet.
    Merci de ton temps en tous cas. Et bonne soirée

    ps:
     Private Sub Dossier_Click(sender As Object, e As EventArgs) Handles Dossier.Click
    
            Dim selectdos As String = String.Empty
            FolderBrowserDialog1.Description = "Veuillez sélectionner le dossier de recherche."
            FolderBrowserDialog1.ShowNewFolderButton = False
            FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.SpecialDirectories.Desktop
    
            If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                Dim dossier_selectionner As String = FolderBrowserDialog1.SelectedPath
                selectdos = FolderBrowserDialog1.SelectedPath
                DossierTextBox.Text = selectdos
            Else
    
            End If
        End Sub

    Et pour suite une textbox pour le code a chercher
    Un bouton pour chercher (la ou j'aimerai intégré ce bout de code plus haut)
    0
  7. Utilisateur anonyme
     
    Si tu es sur qu'il n'y aura pas de doublon
    Private Function FichiersContenantTexte(ByVal Repertoire As String, ByVal TexteATrouver As String) As String
    
    
       For Each fichier As String In Directory.GetFiles(Repertoire,"*.txt",SearchOption.TopDirectoryOnly)
        If File.ReadAllText(fichier).Contains(TexteATrouver) Then
         Return fichier
        End If
       Next fichier
    
       Return String.Empty 's'il n'y a pas d'occurrence ça retourne une chaine vide
    End Function


    0
  8. flamouth1 Messages postés 10 Statut Membre
     
    Salut, du coup c'est bon ça fonctionne, merci beaucoup. Juste une question pour le premier code. Quand on à des doublons par exemple, il m'affiche les fichiers dans ma listbox. Mais comment puis-je faire pour les afficher respectivement dans plusieurs richtextbox. Merci encore pour ton aide.
    0
  9. Utilisateur anonyme
     
    Tu as plusieurs possibilités:
    • créer dynamiquement autant de richtextbox qu'il y a de fichiers, mais ça risque de charger ton interface
    • faire des onglets dynamiquement, un par fichier
    • utiliser une listbox, ou un combobox et afficher le fichier sélectionné
    • tous les concatèner dans un seul richtextbox
    • ....

    0
    1. flamouth1 Messages postés 10 Statut Membre
       
      Une dernière question, Voila un bout du code:
      For Each fichiers As String In Directory.GetFiles(Repertoire, "*.txt")
      If File.ReadAllText(fichiers).Contains(findtxt) Then
      
      resultat.Add(fichiers)
      ListBox1.Items.Add(fichiers)
      
      RichTextBox1.LoadFile(fichiers, RichTextBoxStreamType.PlainText)
      
      End If


      Là, il m'affiche que le 1er résultat pour le moment.
      Il faut lire <fichier> et traiter chaque ligne j'imagine.
      Mais quel est la syntaxe. Je n'y arrive pas. Merci
      0
    2. Utilisateur anonyme
       
      oui, mais ça dépend d'abord de comment tu imagines l'afficher....
      Je t'ai proposé quelques options, si tu en préfères une autre c'est ton choix, mais chaque type d'affichage aura un code particulier.

      Donc commence par choisir ce que tu veux obtenir.
      0
      1. Flamouth2 > Utilisateur anonyme
         
        Excuse moi. Oui je te l'ai pas dit. Le 1er choix. J'ai créé 3 richtextbox pour tester. Je n'arrive qu'à récupérer qu'une ligne de liste de string.
        0
  10. Utilisateur anonyme
     
    Le premier choix je te proposer de les créer dynamiquement les richtexbox.
    C'est ce que j'ai codé
    		Private Sub AfficheLesFichiers()
    			Dim lesFichiers As List(Of String) = FichiersContenantTexte("C:\temp", "toto")
    
    			For i As Integer = 0 To lesFichiers.Count - 1
    				Dim r As New RichTextBox()
    				r.Location = New System.Drawing.Point(i * 50, i * 50) 'pose les controles en diagonale, tous les 50, à toi de gérer ça mieux
    				r.Name = "rtbFichier" & (i+1).ToString()'c'est pas forcement nécessaire
    				r.Size = New System.Drawing.Size(100, 100)
    				r.Text = File.ReadAllText(lesFichiers(i))
    				Me.Controls.Add(r)
                                    r.BringToFront()'place le controle par dessus les autres, il faut le faire après l'avoir ajouté à la form			
                               Next i
    		End Sub

    0
  11. flamouth1 Messages postés 10 Statut Membre
     
    Tous comptes fait c'est trop brouillon en dynamique, du coup j'ai fait une condition pour chaque richtexbox, J'utilisais "fichiers" au lieu de "resultat" et évidement ça ne fonctionnait pas.
    Voila le code terminé pour ceux qui rechercherai la même chose.
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    
            TextBox1.Clear()
            TextBox2.Clear()
            TextBox3.Clear()
            TextBox4.Clear()
            RichTextBox1.Clear()
            RichTextBox2.Clear()
            RichTextBox3.Clear()
            RichTextBox4.Clear()
    
            Dim Repertoire As String = String.Empty
            Dim findtxt As String = String.Empty
            Dim resultat As New List(Of String)
          
    
            Repertoire = DossierTextBox.Text
            findtxt = FindTextBox.Text
    
            For Each fichiers As String In Directory.GetFiles(Repertoire, "*.txt")
                If File.ReadAllText(fichiers).Contains(findtxt) Then
    
                    resultat.Add(fichiers)
    
                End If
                
            Next fichiers
    
            '1
            If resultat.Count = 1 Then
                TextBox1.Text = resultat.Item(0)
                RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
            End If
            '2
            If resultat.Count = 2 Then
                TextBox1.Text = resultat.Item(1)
                TextBox2.Text = resultat.Item(0)
                RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
                RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
            End If
            '3
            If resultat.Count = 3 Then
                TextBox1.Text = resultat.Item(2)
                TextBox2.Text = resultat.Item(1)
                TextBox3.Text = resultat.Item(0)
                RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
                RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
                RichTextBox3.LoadFile(TextBox3.Text, RichTextBoxStreamType.PlainText)
            End If
            '4
            If resultat.Count = 4 Then
                TextBox1.Text = resultat.Item(3)
                TextBox2.Text = resultat.Item(2)
                TextBox3.Text = resultat.Item(1)
                TextBox4.Text = resultat.Item(0)
                RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
                RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
                RichTextBox3.LoadFile(TextBox3.Text, RichTextBoxStreamType.PlainText)
                RichTextBox4.LoadFile(TextBox4.Text, RichTextBoxStreamType.PlainText)
            End If
    
    
        End Sub


    Merci Whismeril pour ton aide.
    0
    1. Utilisateur anonyme
       
      'est trop brouillon en dynamique
      je t'avais dit
      mais ça risque de charger ton interface


      Pour moi le meilleur rapport ergonomie/simplicité de code est la listeBox (ou le combobox) ou l'on sélectionne quel fichier afficher dans un seul et unique RichTextBox
      0