Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recherche une chaine dans fichiers de chaque dossiers

7 réponses
Avatar
Pascal
bonsoir,
je recherche à aficher dans une liste les fichiers contenant ma recherche
pour comprenure:
txtRecherche.txt = test
ce code devrait ouvrir chaque dossiers, dans chacun de ceux-ci vérifier s'il
existe dans chaque fichier la valeur de recherche (test) si oui l'ajouter à
la liste
Tous les dossiers ne contiennent pas de sous-dossiers

bien évidemment ca marche pas, un petit conseil bienvenu
merci d'avance
Pascal
=====================================
Private Sub RechercherFichiers()
Dim FSO As New FileSystemObject
Dim Dossier As Folder
Dim Fichier As File
Set Dossier = FSO.GetFolder(Me.Dir1.Path)
With Me.ListView1
.ListItems.Clear

For i = 0 To Me.Dir1.ListCount - 1
s = Mid(Me.Dir1.List(i), InStrRev(Me.Dir1.List(i), "\") + 1)
.ListItems.Add , , s, 1
For Each Fichier In Dossier.Files
If UCase$(right$(Fichier, Len(Fichier))) =
UCase$(txtRecherche.Text) Then Liste.AddItem Fichier
Next Fichier
Next i
End With
Set Dossier = Nothing
End Sub

7 réponses

Avatar
Pascal
hello, ai essayé avec ceci mais ne donne rien
If InStr(1, Fichier, txtRecherche.Text, vbTextCompare) Then Liste.AddItem
Fichier

je dois pas être loin non?

meilleurs voeux
Pascal

"Pascal" a écrit dans le message de news:
#
bonsoir,
je recherche à aficher dans une liste les fichiers contenant ma recherche
pour comprenure:
txtRecherche.txt = test
ce code devrait ouvrir chaque dossiers, dans chacun de ceux-ci vérifier


s'il
existe dans chaque fichier la valeur de recherche (test) si oui l'ajouter


à
la liste
Tous les dossiers ne contiennent pas de sous-dossiers

bien évidemment ca marche pas, un petit conseil bienvenu
merci d'avance
Pascal
==================================== > Private Sub RechercherFichiers()
Dim FSO As New FileSystemObject
Dim Dossier As Folder
Dim Fichier As File
Set Dossier = FSO.GetFolder(Me.Dir1.Path)
With Me.ListView1
.ListItems.Clear

For i = 0 To Me.Dir1.ListCount - 1
s = Mid(Me.Dir1.List(i), InStrRev(Me.Dir1.List(i), "") + 1)
.ListItems.Add , , s, 1
For Each Fichier In Dossier.Files
If UCase$(right$(Fichier, Len(Fichier))) > UCase$(txtRecherche.Text) Then Liste.AddItem Fichier
Next Fichier
Next i
End With
Set Dossier = Nothing
End Sub



Avatar
Jacques93
Bonsoir Pascal,
Pascal a écrit :
bonsoir,
je recherche à aficher dans une liste les fichiers contenant ma recherche
pour comprenure:
txtRecherche.txt = test
ce code devrait ouvrir chaque dossiers, dans chacun de ceux-ci vérifier s'il
existe dans chaque fichier la valeur de recherche (test) si oui l'ajouter à
la liste
Tous les dossiers ne contiennent pas de sous-dossiers

bien évidemment ca marche pas, un petit conseil bienvenu
merci d'avance
Pascal
==================================== > Private Sub RechercherFichiers()
Dim FSO As New FileSystemObject
Dim Dossier As Folder
Dim Fichier As File
Set Dossier = FSO.GetFolder(Me.Dir1.Path)
With Me.ListView1
.ListItems.Clear

For i = 0 To Me.Dir1.ListCount - 1
s = Mid(Me.Dir1.List(i), InStrRev(Me.Dir1.List(i), "") + 1)
.ListItems.Add , , s, 1
For Each Fichier In Dossier.Files
If UCase$(right$(Fichier, Len(Fichier))) > UCase$(txtRecherche.Text) Then Liste.AddItem Fichier
Next Fichier
Next i
End With
Set Dossier = Nothing
End Sub




Pour ma comprenance, pourquoi utiliser un contrôle DirLisBox et un objet
FSO, puis mélanger les deux ?

Pour passer le test de non comprenance c'est ici :

http://www.leconcombre.com/movies/testidiot1.html

c'est juste pour déconner un peu :-D

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"Pascal" a écrit dans le message de
news:
hello, ai essayé avec ceci mais ne donne rien
If InStr(1, Fichier, txtRecherche.Text, vbTextCompare) Then


Liste.AddItem
Fichier

je dois pas être loin non?



Hello,

nul besoin de FSO ici, un simple Dir$() suffit.
Voici une façon possible de faire:

la fonction:

Private Function ChercheFichiers(ByVal repertoire As String, _
ByVal pattern As String, _
ByRef tResult() As String, _
ByRef nbResult As Long) As Boolean
Dim fichier As String

fichier = Dir$(repertoire & "*.*")
While fichier <> ""
If InStr(1, fichier, pattern, vbTextCompare) <> 0 Then
nbResult = nbResult + 1
ReDim Preserve tResult(nbResult)
tResult(nbResult) = fichier
End If
fichier = Dir$
Wend
ChercheFichiers = True
End Function

et l'utilisation:

Private Sub Command1_Click()
Dim r As Boolean
Dim repertoire As String
Dim pattern As String
Dim tabloResults() As String
Dim nbResults As Long
Dim i As Long

repertoire = "c:jm"
pattern = "test"

r = ChercheFichiers(repertoire, pattern, tabloResults, nbResults)
If r Then
For i = 1 To nbResults
Debug.Print tabloResults(i)
Next i
End If
End Sub

Il y a bien sur mille et une façons d'implémenter ça. Celle ci
fonctionne bien, ne doit pas être hyper performante à cause du
Redim preserve mais c'est un autre problème qu'il serait facile
de résoudre.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Pascal
bonsoir Jean-marc,
merci pour ta réponse, je vais essayer ton code
j'avais entre-temps développer ceci qui est très performant en vitesse
d'exécution mais j'aurais voulu l'afficher dans la file list
(flstListDeChoix) et ca j'y arrive jpas,je l'affiche donc dans une liste en
attendant de trouver la façon de faire, voici le code:
=============================== Private Sub TrouverFichiers()
Dim j As Integer
With Me.ListView1
.ListItems.Clear

For i = 0 To Me.Dir1.ListCount - 1
s = Mid(Me.Dir1.List(i), InStrRev(Me.Dir1.List(i), "") + 1)
.ListItems.Add , , s, 1

Me.FlstListeDeChoix.Path = Me.Dir1.List(i)
Me.FlstListeDeChoix.Pattern = "*" & txtRecherche.Text & "*.*"

If Me.FlstListeDeChoix.ListCount > 0 Then
For j = 0 To Me.FlstListeDeChoix.ListCount - 1
LstPlaylist.AddItem Me.Dir1.List(i) & "" &
Me.FlstListeDeChoix.List(j)
Next j
End If
Next i

Me.FlstListeDeChoix.Pattern = ""
Me.Dir1.Path = DirectoryPrincipal
End With
End Sub

"Jean-Marc" a écrit dans le message de news:
43b5b9b5$0$10960$
"Pascal" a écrit dans le message de
news:
> hello, ai essayé avec ceci mais ne donne rien
> If InStr(1, Fichier, txtRecherche.Text, vbTextCompare) Then
Liste.AddItem
> Fichier
>
> je dois pas être loin non?

Hello,

nul besoin de FSO ici, un simple Dir$() suffit.
Voici une façon possible de faire:

la fonction:

Private Function ChercheFichiers(ByVal repertoire As String, _
ByVal pattern As String, _
ByRef tResult() As String, _
ByRef nbResult As Long) As Boolean
Dim fichier As String

fichier = Dir$(repertoire & "*.*")
While fichier <> ""
If InStr(1, fichier, pattern, vbTextCompare) <> 0 Then
nbResult = nbResult + 1
ReDim Preserve tResult(nbResult)
tResult(nbResult) = fichier
End If
fichier = Dir$
Wend
ChercheFichiers = True
End Function

et l'utilisation:

Private Sub Command1_Click()
Dim r As Boolean
Dim repertoire As String
Dim pattern As String
Dim tabloResults() As String
Dim nbResults As Long
Dim i As Long

repertoire = "c:jm"
pattern = "test"

r = ChercheFichiers(repertoire, pattern, tabloResults, nbResults)
If r Then
For i = 1 To nbResults
Debug.Print tabloResults(i)
Next i
End If
End Sub

Il y a bien sur mille et une façons d'implémenter ça. Celle ci
fonctionne bien, ne doit pas être hyper performante à cause du
Redim preserve mais c'est un autre problème qu'il serait facile
de résoudre.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



Avatar
Pascal
bonsoir jacques,
pour te répondre, ben je cherche tout simplement, la fatigue aidant je n'ai
même pas remarqué cela.........
pour la déconnade j'ai fais ton Test idiot
bien à toi
Pascal
"Jacques93" a écrit dans le message de news:
ud4Ki#
Bonsoir Pascal,
Pascal a écrit :
> bonsoir,
> je recherche à aficher dans une liste les fichiers contenant ma


recherche
> pour comprenure:
> txtRecherche.txt = test
> ce code devrait ouvrir chaque dossiers, dans chacun de ceux-ci vérifier


s'il
> existe dans chaque fichier la valeur de recherche (test) si oui


l'ajouter à
> la liste
> Tous les dossiers ne contiennent pas de sous-dossiers
>
> bien évidemment ca marche pas, un petit conseil bienvenu
> merci d'avance
> Pascal
> ==================================== > > Private Sub RechercherFichiers()
> Dim FSO As New FileSystemObject
> Dim Dossier As Folder
> Dim Fichier As File
> Set Dossier = FSO.GetFolder(Me.Dir1.Path)
> With Me.ListView1
> .ListItems.Clear
>
> For i = 0 To Me.Dir1.ListCount - 1
> s = Mid(Me.Dir1.List(i), InStrRev(Me.Dir1.List(i), "") + 1)
> .ListItems.Add , , s, 1
> For Each Fichier In Dossier.Files
> If UCase$(right$(Fichier, Len(Fichier))) > > UCase$(txtRecherche.Text) Then Liste.AddItem Fichier
> Next Fichier
> Next i
> End With
> Set Dossier = Nothing
> End Sub
>

Pour ma comprenance, pourquoi utiliser un contrôle DirLisBox et un objet
FSO, puis mélanger les deux ?

Pour passer le test de non comprenance c'est ici :

http://www.leconcombre.com/movies/testidiot1.html

c'est juste pour déconner un peu :-D

--
Cordialement,

Jacques.


Avatar
Jean-Marc
"Pascal" a écrit dans le message de
news:%23%
bonsoir Jean-marc,
merci pour ta réponse, je vais essayer ton code
j'avais entre-temps développer ceci qui est très performant en vitesse
d'exécution mais j'aurais voulu l'afficher dans la file list
(flstListDeChoix) et ca j'y arrive jpas,je l'affiche donc dans une


liste en
attendant de trouver la façon de faire, voici le code:



Une remarque d'ordre général: Une bonne pratique est de dissocier
l'interface et le fonctionnel.

Le but de ta fonction est de trouver des fichiers dont le nom contient
un motif, ce qui est *bien*. Ceci n'a rien à voir avec le fait que tu
souhaites afficher ceci dans tel ou tel composant. Si demain je voulais
réutiliser ta fonction, cela me serait impossible car elle est
complètement dépendante de ton interface graphique, ce qui est *mal*.

La fonction que j'ai donnée en exemple est totalement indépendante de
tout élément de l'interface. Elle n'utilise que ses arguments (byval et
byref) et ses variables locales. N'importe qui peut la copier et
l'utiliser, libre à l'utilisateur d'exploiter ensuite les résultats de
la fonction dans l'interface graphique de son choix. Elle se suffit à
elle même.

Avantages:
- le code est réutilisable par toi ou par d'autres
- si tu changes complètement ton interface, aucun problème, le code de
la
fonction ne change pas
- si tu changes l'algorithme de ta fonction, aucun problème: c'est
transparent pour ton interface qui elle ne change pas

C'est une pratique générale dans la conception logicielle, et c'est un
principe fondamental du génie logiciel; plus les modules focntionnels
d'un logiciel sont indépendants (ie : peu de couplage), plus le logiciel
sera aisé à maintenir, à modifier, à faire vivre, etc.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Pascal
merci du conseil,
il est vrai que pour un débutant autodidacte il vaut mieux éviter de prendre
de mauvais plis, je te remercie pour cette précision
Meilleurs voeux
Pascal

"Jean-Marc" a écrit dans le message de news:
43b6813b$0$8927$
"Pascal" a écrit dans le message de
news:%23%
> bonsoir Jean-marc,
> merci pour ta réponse, je vais essayer ton code
> j'avais entre-temps développer ceci qui est très performant en vitesse
> d'exécution mais j'aurais voulu l'afficher dans la file list
> (flstListDeChoix) et ca j'y arrive jpas,je l'affiche donc dans une
liste en
> attendant de trouver la façon de faire, voici le code:

Une remarque d'ordre général: Une bonne pratique est de dissocier
l'interface et le fonctionnel.

Le but de ta fonction est de trouver des fichiers dont le nom contient
un motif, ce qui est *bien*. Ceci n'a rien à voir avec le fait que tu
souhaites afficher ceci dans tel ou tel composant. Si demain je voulais
réutiliser ta fonction, cela me serait impossible car elle est
complètement dépendante de ton interface graphique, ce qui est *mal*.

La fonction que j'ai donnée en exemple est totalement indépendante de
tout élément de l'interface. Elle n'utilise que ses arguments (byval et
byref) et ses variables locales. N'importe qui peut la copier et
l'utiliser, libre à l'utilisateur d'exploiter ensuite les résultats de
la fonction dans l'interface graphique de son choix. Elle se suffit à
elle même.

Avantages:
- le code est réutilisable par toi ou par d'autres
- si tu changes complètement ton interface, aucun problème, le code de
la
fonction ne change pas
- si tu changes l'algorithme de ta fonction, aucun problème: c'est
transparent pour ton interface qui elle ne change pas

C'est une pratique générale dans la conception logicielle, et c'est un
principe fondamental du génie logiciel; plus les modules focntionnels
d'un logiciel sont indépendants (ie : peu de couplage), plus le logiciel
sera aisé à maintenir, à modifier, à faire vivre, etc.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;