Problème lors de la recherche. Mais pourquoi ?

Résolu
Hackdevil Messages postés 28 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 5 mai 2014 - 12 juin 2013 à 11:56
 Utilisateur anonyme - 14 juin 2013 à 13:04
Bonjour,

J'ai fait un système de recherche de fichier qui fonctionne à peu près correctement.
A peu près parce qu'il y a parfois des résultats étonnants et je n'arrive pas à comprendre pourquoi.

Voici le code :

    Dim di As DirectoryInfo = New DirectoryInfo("U:")
    Dim TousLesFichiers As FileInfo() = Nothing

Try
                        For Each Repertoire In di.GetDirectories
                            Try
                                TousLesFichiers = Repertoire.GetFiles("*" & txtboxRecherche.Text & "*", SearchOption.AllDirectories)

                                For Each ChaqueFichier In TousLesFichiers
                                    FormTableauAffichage.RtxtBoxListe.Text &= vbCrLf & ChaqueFichier.FullName
                                    FormTableauAffichage.RtxtBoxListe.SelectionAlignment = HorizontalAlignment.Center
                                Next
                            Catch ex As UnauthorizedAccessException

                            End Try
                        Next
                    Catch ex As Exception
                        MessageBox.Show(ex.Message, "ERREUR")
                        EnregistreRepertoire()
                        Exit Sub
                    End Try


Donc, on renseigne une partie du nom de fichier à rechercher dans txtboxRecherche.Text et on lance la recherche.
Il est cencé me trouver tous les fichiers contenant par exemple "fe" (ces deux lettres me donnent des mauvais résultats).
Puis me l'affiche dans un richtextbox qui est dans un autre form.
En cas d'accès refusé, il continue.

Voici le resultat de ma recherche :

U:\2008 server\Outils\GPO\CSE pour Win 2003 (Preferences pour GPO).exe
U:\2008 server\Outils\GPO\CSE pour XP (Preferences pour GPO).exe
U:\2008 server\Outils\GPO\AdminTemplates_x86\access14.adm9
U:\2008 server\Outils\GPO\AdminTemplates_x86\office14.adml5
U:\2008 server\Outils\GPO\AdminTemplates_x86\office14.adm5
U:\2008 server\Outils\GPO\AdminTemplates_x86\onent14.adml4
U:\2008 server\Outils\GPO\AdminTemplates_x86\visio14.admx
U:\2008 server\Outils\GPO\AdminTemplates_x86\word14.adml2
U:\2008 server\Outils\GPO\AdminTemplates_X64\access14.adm9
U:\2008 server\Outils\GPO\AdminTemplates_X64\office14.adml5
U:\2008 server\Outils\GPO\AdminTemplates_X64\office14.adm5
U:\2008 server\Outils\GPO\AdminTemplates_X64\onent14.adml4
U:\2008 server\Outils\GPO\AdminTemplates_X64\visio14.admx
U:\2008 server\Outils\GPO\AdminTemplates_X64\word14.adml2
U:\ASSR2 2012-2013\ASSR2_Rattrapage_56cdfe3ce5 Rattrapage\CORRIGE_ASSR2_56cdfe3ce5.pdf
U:\ASSR2 2012-2013\ASSR2_Rattrapage_56cdfe3ce5 Rattrapage\Epreuve_ASSR2_ref_56cdfe3ce5.avi
U:\ASSR2 2012-2013\ASSR2_Rattrapage_56cdfe3ce5 Rattrapage\GRILLES_ASSR2_56cdfe3ce5.pdf
U:\Ma musique\08 - Get Lucky (feat. Pharrell Williams).mp3
U:\System\Application Data\OpenOffice.org\3\user\registry\cache\org.openoffice.Setup.dat
U:\System\Application Data\Mozilla\Firefox\Profiles\Default\extensions\{20a82645-c095-46ed-80e3-08825760534b}\chrome.manifest
U:\System\Application Data\Microsoft\Protect\S-1-5-21-4181368152-1849255957-1605149384-1108\ee38ac6f-1687-49e2-bbfe-c3d596af4646
U:\System\Application Data\Microsoft\Protect\S-1-5-21-4181368152-1849255957-1605149384-1108\Preferred
U:\System\Application Data\Microsoft\Crypto\RSA\S-1-5-21-4181368152-1849255957-1605149384-1108\83aa4cc77f591dfc2374580bbd95f6ba_45c91fed-d921-4454-9a79-6f967172432c
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\1F356F4D07FE8C483E769E4586569404
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\3130B1871A126520A8C47861EFE3ED4D
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\7B2238AACCEDC3F1FFE8E7EB5F575EC9
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\8EDCF682921FE94F4A02A43CD1A28E6B
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\D0F063B6B88A2B8BFE21C3993A613447
U:\System\Application Data\Microsoft\CryptnetUrlCache\MetaData\D41693DAFE5DEF0C36959FF1FCEF5C96
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\1F356F4D07FE8C483E769E4586569404
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\3130B1871A126520A8C47861EFE3ED4D
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\7B2238AACCEDC3F1FFE8E7EB5F575EC9
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\8EDCF682921FE94F4A02A43CD1A28E6B
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\D0F063B6B88A2B8BFE21C3993A613447
U:\System\Application Data\Microsoft\CryptnetUrlCache\Content\D41693DAFE5DEF0C36959FF1FCEF5C96
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\obj\x86\Release\DesignTimeResolveAssemblyReferences.cache
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\obj\x86\Release\DesignTimeResolveAssemblyReferencesInput.cache
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\obj\x86\Debug\DesignTimeResolveAssemblyReferences.cache
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\obj\x86\Debug\DesignTimeResolveAssemblyReferencesInput.cache
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\My Project\app.manifest
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\bin\Release\RechercheLycée.vshost.exe.manifest
U:\Visual Studio 2010\Projects\RechercheLycée\RechercheLycée\bin\Debug\WindowsApplication1.vshost.exe.manifest
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\obj\x86\Release\DesignTimeResolveAssemblyReferences.cache
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\obj\x86\Release\DesignTimeResolveAssemblyReferencesInput.cache
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\obj\x86\Debug\DesignTimeResolveAssemblyReferences.cache
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\obj\x86\Debug\DesignTimeResolveAssemblyReferencesInput.cache
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\My Project\app.manifest
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\bin\Release\RechercheLycée.vshost.exe.manifest
U:\Visual Studio 2010\Projects\Copie de RechercheLycée\RechercheLycée\bin\Debug\WindowsApplication1.vshost.exe.manifest


Pourquoi me trouve-t-il

"U:\2008 server\Outils\GPO\AdminTemplates_x86\access14.adm9
U:\2008 server\Outils\GPO\AdminTemplates_x86\office14.adml5
U:\2008 server\Outils\GPO\AdminTemplates_x86\office14.adm5
U:\2008 server\Outils\GPO\AdminTemplates_x86\onent14.adml4
U:\2008 server\Outils\GPO\AdminTemplates_x86\visio14.admx
U:\2008 server\Outils\GPO\AdminTemplates_x86\word14.adml2
U:\2008 server\Outils\GPO\AdminTemplates_X64\access14.adm9
U:\2008 server\Outils\GPO\AdminTemplates_X64\office14.adml5
U:\2008 server\Outils\GPO\AdminTemplates_X64\office14.adm5
U:\2008 server\Outils\GPO\AdminTemplates_X64\onent14.adml4
U:\2008 server\Outils\GPO\AdminTemplates_X64\visio14.admx
U:\2008 server\Outils\GPO\AdminTemplates_X64\word14.adml2"

par exemple alors qu'il n'y a pas de "fe" dedans ?

Le problème se situe certainement dans :

TousLesFichiers = Repertoire.GetFiles("*" & txtboxRecherche.Text & "*", SearchOption.AllDirectories)


Merci pour votre aide.

6 réponses

Utilisateur anonyme
13 juin 2013 à 17:03
Déjà tu ne dois pas appeler ta sub 'Dir' car j'ai vu que tu n'as pas désactivé 'Microsoft.VisualBasic' dans les références.
Il va utiliser donc la fonction Dir de VB6 directement et voilà le pourquoi de certaines de tes erreurs.

Ta sub doit se résumer à ça:
    'Sub MaDir A NE PAS CONFONDRE AVEC L'INSTRUCTION 'DIR' DE VB6
    Private Sub MaDir(ByVal Chemin As String)
        If txtboxRecherche.TextLength >= 2 Then
            Try
                For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                    If Fichier.Contains(txtboxrecherche) Then
                        FormTableauAffichage.RtxtBoxListe.Text &= Environment.NewLine & Fichier
                        FormTableauAffichage.RtxtBoxListe.SelectionAlignment = HorizontalAlignment.Center
                    End If
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

            Try
                For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                    MaDir(Dossier)
                Next
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
Hackdevil Messages postés 28 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 5 mai 2014
14 juin 2013 à 11:32
Ah, ça y est j'ai trouvé :

Private Sub Recherche(ByVal Chemin As String)
        Try
            Dim NomFichier As String

            For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                NomFichier = System.IO.Path.GetFileName(Fichier)
                If NomFichier.Contains(txtboxRecherche.text) Then
                    ListFichiers.Items.Add(Fichier)
                End If
            Next
        Catch ex As Exception
            ListErreurs.Items.Add(ex.Message)
        End Try
        Try
            For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                Recherche(Dossier)
            Next
        Catch ex As Exception
        End Try
    End Sub


Merci encore acive, tu m'as bien aidé.

A bientôt.
3
Utilisateur anonyme
12 juin 2013 à 12:24
Bonjour,
Essaye ça... ça devrait te remettre dans la bonne voie...

Option Explicit On
Option Strict On

Public Class Form1
    Dim ListFichiers As New ListBox
    Dim ListErreurs As New ListBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListFichiers.Top = 0
        ListErreurs.Top = ListFichiers.Height + 20
        ListFichiers.Left = 0
        ListErreurs.Left = 0
        ListFichiers.Width = 450
        ListErreurs.Width = 450

        Me.Controls.Add(ListFichiers)
        Me.Controls.Add(ListErreurs)
        Recherche("c:\windows\system32")

    End Sub

    Private Sub Recherche(ByVal Chemin As String)
        Try
            For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                ListFichiers.Items.Add(Fichier)
            Next
        Catch ex As Exception
            ListErreurs.Items.Add(ex.Message)
        End Try
        Try
            For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                Recherche(Dossier)
            Next
        Catch ex As Exception
        End Try

    End Sub
End Class



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Hackdevil Messages postés 28 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 5 mai 2014
13 juin 2013 à 12:19
Bonjour,

je viens de tester ton code et effectivement il y a du mieux.
Mais ça vérifie dans le chemin et non juste le nom de fichier.

Je me suis basé sur ton code, ce qui donne ça :

Option Explicit On
Option Strict On

Imports System.IO
Imports System
Imports Microsoft.Win32

Public Class FormPrincipal

Dim di As DirectoryInfo = New DirectoryInfo("G:\classement")

Private Sub btnRecherche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecherche.Click
        Dir(di.FullName)
        FormTableauAffichage.ShowDialog()
End Sub


Private Sub Dir(ByVal Chemin As String)
        If txtboxRecherche.TextLength >= 2 Then
            Try
                For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                    If Fichier Like "*" & txtboxRecherche.Text & "*" Then
                        FormTableauAffichage.RtxtBoxListe.Text &= vbCrLf & Fichier
                        FormTableauAffichage.RtxtBoxListe.SelectionAlignment = HorizontalAlignment.Center
                    End If
                Next
            Catch ex As Exception

            End Try

            Try
                Try
                    For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                        Dir(Dossier)
                    Next
                Catch ex As UnauthorizedAccessException

                End Try
            Catch ex As Exception
                MessageBox.Show(ex.Message, "ERREUR")
                EnregistreRepertoire()
                Exit Sub
            End Try
        Else
            MessageBox.Show("Texte trop court, 2 caractères minimum", "ERREUR")
            Exit Sub
        End If
    End Sub

Sub EnregistreRepertoire()
'''Aucun interet dans ce sujet'''
End Sub

End Class


Par contre je n'ai pas la solution pour faire la vérification sur le fichier et non le chemin complet.
Une piste ?

Merci.
0

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

Posez votre question
Hackdevil Messages postés 28 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 5 mai 2014
14 juin 2013 à 10:38
Bonjour,

Merci ça m'aura fait apprendre l'équivalent de vbcrlf qui est Environment.NewLine.

J'ai viré du coup 'Microsoft.VisualBasic' dans les références.

J'avais pas percuté pour le dir que ça aurait pu créer un conflit mais dans ce cas là, ce n'est pas ce qui fait que ça ne fonctionne pas.

On demande de tester chaque nom de fichier pour voir s'il contient la chaine "fe" par exemple.
Si c'est le cas, il l'ajoute au textbox.

Mais pourtant ce n'est pas ce qu'il se passe.

Il ne semble pas vérifier si c'est le nom de fichier qui contient la chaine "fe" mais si c'est le nom du chemin.
Du coup il me sort plus de résultats que prévu.

Du coup, je me suis dit, pourquoi ne pas récupérer la chaine jusqu'au "" en partant de la droite puis tester s'il contient "fe".
Le problème c'est que je ne trouve pas en vb.net de façon de le faire simplement.
Il y a bien la solution du split et récupérer la dernière chaine mais c'est pas terrible...

Il me semble aussi qu'on peut récupérer juste les fichiers avec un truc du genre blabla.name au lieu de blabla.fullname.

Désolé, je programme une fois par an en autodidacte donc je n'ai pas un bon niveau.
0
Utilisateur anonyme
14 juin 2013 à 13:04
 NomFichier = System.IO.Path.GetFileName(Fichier)
                If NomFichier.Contains(txtboxRecherche.text) Then
                    ListFichiers.Items.Add(Fichier)
                End If


Oui... excuse,
C'est ce que je voulais écrire et j'ai oublié de rectifier...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous