OVH Cloud OVH Cloud

Rechercher des fichiers

4 réponses
Avatar
Nicolas B.
Bonjour,

Comment dois-je m'y prendre pour effectuer une recherche de fichiers, afin
de bidouiller quelques trucs sur ceux-ci par une boucle "for each fichier in
fichiers" ?
Je voudrais rechercher tous les fichiers contenus dans un certain dossier (y
compris les sous dossiers), correspondant à certain critère pour le nom
("*.doc" par exemple).

J'ai cherché dans les archives du forum, mais l'exemple que j'ai trouvé
parcours les fichiers du dossier spécifié, les fichiers des sous dossiers,
mas pas les fichiers des sous sous dossiers (ni les suivants).


Merci
--
Nicolas B.

4 réponses

Avatar
Laurent B
Salut,
J'ai eu ce probléme et j'ai été obligé de bidouiller une
fonction, c'est surement pas le meilleur mais ça marche :

1) Declarer un tableau de type string :

Public tabMoveDossier() As String

2) Ensuite remplir le tableau avec 2 valeurs avant
d'appeler la fonction :

tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"

3) Appeler la fonction

4) LA FONCTION :

Explorer récursivement chaque dossier qui sera mémorisé
dans le tableau et testé si chaque réponse à déjà eté
prise en compte. Si la réponse n'est pas mémorisée par le
tableau, redimentionner ce dernier et ajouter le nouveau
dossier, mettre la variable blnReprise à True pour
reprendre la recherche.

Une fois la rechercher terminée, on récupére un tableau
avec chaque sous-dossier du sous-dossier, etc ...
A partir de là, on peut explorer recursivement chaque
dossier du tableau pour récuperer les fichiers présents.


**********************************************************
Private Function f_MoveDossier()
Dim sDossiers(), sDossier As String
Dim i, j, k, l As Integer
j = tabMoveDossier(0)
Dim blnExist, blnReprise As Boolean

blnReprise = False
For i = 1 To j
sDossiers = Directory.GetDirectories
(tabMoveDossier(i))
For Each sDossier In sDossiers
blnExist = False
For k = 1 To j
If (tabMoveDossier(k) = sDossier) Then
blnExist = True
Exit For
End If
Next
If (blnExist = False) Then
l = tabMoveDossier(0) + 1
ReDim Preserve tabMoveDossier(l)
tabMoveDossier(0) = l
tabMoveDossier(l) = sDossier
blnReprise = True
End If
Next
Next
If (blnReprise = True) Then f_MoveDossier()
End Function
**********************************************************

Ne pas oublier de reinitialiser le tableau avant de faire
une nouvelle recherche :

Dim tabReset(1) As String
tabMoveDossier = tabReset
tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"


Voila, c'est surement pas ce qui se fait de mieux, mais
si quelqu'un a une meilleure solution, je suis preneur.

PS : Si vous pensez à la methode Directory.Move, il faut
savoir que celle-ci n'est valable que lorsque la source
et la destination se trouvent sur le même lecteur. Elle
ne fonctionne pas pour deplacer des fichiers du lecteur
C: au lecteur D:.

Laurent


//////////////////////////////////////////////
-----Message d'origine-----
Bonjour,

Comment dois-je m'y prendre pour effectuer une recherche


de fichiers, afin
de bidouiller quelques trucs sur ceux-ci par une


boucle "for each fichier in
fichiers" ?
Je voudrais rechercher tous les fichiers contenus dans


un certain dossier (y
compris les sous dossiers), correspondant à certain


critère pour le nom
("*.doc" par exemple).

J'ai cherché dans les archives du forum, mais l'exemple


que j'ai trouvé
parcours les fichiers du dossier spécifié, les fichiers


des sous dossiers,
mas pas les fichiers des sous sous dossiers (ni les


suivants).


Merci
--
Nicolas B.


.



Avatar
Nicolas B.
Merci, Laurent.

Je testerai ça demain. C'est quand même bizarre qu'il n'existe pas de
fonction toute faite (comme FileSearch en VBA).


A+
--
Nicolas B.


Laurent B a écrit :
Salut,
J'ai eu ce probléme et j'ai été obligé de bidouiller une
fonction, c'est surement pas le meilleur mais ça marche :

1) Declarer un tableau de type string :

Public tabMoveDossier() As String

2) Ensuite remplir le tableau avec 2 valeurs avant
d'appeler la fonction :

tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"

3) Appeler la fonction

4) LA FONCTION :

Explorer récursivement chaque dossier qui sera mémorisé
dans le tableau et testé si chaque réponse à déjà eté
prise en compte. Si la réponse n'est pas mémorisée par le
tableau, redimentionner ce dernier et ajouter le nouveau
dossier, mettre la variable blnReprise à True pour
reprendre la recherche.

Une fois la rechercher terminée, on récupére un tableau
avec chaque sous-dossier du sous-dossier, etc ...
A partir de là, on peut explorer recursivement chaque
dossier du tableau pour récuperer les fichiers présents.


**********************************************************
Private Function f_MoveDossier()
Dim sDossiers(), sDossier As String
Dim i, j, k, l As Integer
j = tabMoveDossier(0)
Dim blnExist, blnReprise As Boolean

blnReprise = False
For i = 1 To j
sDossiers = Directory.GetDirectories
(tabMoveDossier(i))
For Each sDossier In sDossiers
blnExist = False
For k = 1 To j
If (tabMoveDossier(k) = sDossier) Then
blnExist = True
Exit For
End If
Next
If (blnExist = False) Then
l = tabMoveDossier(0) + 1
ReDim Preserve tabMoveDossier(l)
tabMoveDossier(0) = l
tabMoveDossier(l) = sDossier
blnReprise = True
End If
Next
Next
If (blnReprise = True) Then f_MoveDossier()
End Function
**********************************************************

Ne pas oublier de reinitialiser le tableau avant de faire
une nouvelle recherche :

Dim tabReset(1) As String
tabMoveDossier = tabReset
tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"


Voila, c'est surement pas ce qui se fait de mieux, mais
si quelqu'un a une meilleure solution, je suis preneur.

PS : Si vous pensez à la methode Directory.Move, il faut
savoir que celle-ci n'est valable que lorsque la source
et la destination se trouvent sur le même lecteur. Elle
ne fonctionne pas pour deplacer des fichiers du lecteur
C: au lecteur D:.

Laurent


Avatar
Zoury
Salut à vous! :O)

Il suffit de faire une fonction recursive.. mais c'est presque déjà tout
fait.. ;O)

'***
Imports System.IO

Module Module1

Sub Main()

' On liste les fichiers existants selon nos critères
PrintFilesList("D:DeveloppementGco.OlymSync.Bocenor", "*.sln",
True)

' Permet de voir les résultats avant de quitter..
Console.WriteLine()
Console.WriteLine("Press Enter to quit...")
Console.ReadLine()

End Sub

' Imprime la liste des fichiers trouvées,
' fonctionne de manière récursive si désirée
Private Sub PrintFilesList(ByRef SearchPath As String, ByRef
SearchPattern As String, ByRef IsRecursive As Boolean)

' Conserver la liste des fichiers et des répertoires
' contenus dans le répertoire courant [SearchPath]
'
Dim sFiles() As String = Directory.GetFiles(SearchPath,
SearchPattern)
Dim sFolders() As String = Directory.GetDirectories(SearchPath)
Dim sFile As String
Dim sFolder As String

' Imprime le nom des fichiers trouvés
'
If (sFiles.Length > 0) Then
For Each sFile In sFiles
Console.WriteLine(sFile)
Next
End If

' On rappelle la fonction avec les sous-répertoires
' du répertoire courant si nécessaire..
If (IsRecursive AndAlso sFolders.Length > 0) Then
For Each sFolder In sFolders
PrintFilesList(sFolder, SearchPattern, IsRecursive)
Next
End If

End Sub

End Module
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"Nicolas B." a écrit dans le message de
news:
Merci, Laurent.

Je testerai ça demain. C'est quand même bizarre qu'il n'existe pas de
fonction toute faite (comme FileSearch en VBA).


A+
--
Nicolas B.


Laurent B a écrit :
> Salut,
> J'ai eu ce probléme et j'ai été obligé de bidouiller une
> fonction, c'est surement pas le meilleur mais ça marche :
>
> 1) Declarer un tableau de type string :
>
> Public tabMoveDossier() As String
>
> 2) Ensuite remplir le tableau avec 2 valeurs avant
> d'appeler la fonction :
>
> tabMoveDossier(0) = 1
> tabMoveDossier(1) = "Path_Dossier_à_Explorer"
>
> 3) Appeler la fonction
>
> 4) LA FONCTION :
>
> Explorer récursivement chaque dossier qui sera mémorisé
> dans le tableau et testé si chaque réponse à déjà eté
> prise en compte. Si la réponse n'est pas mémorisée par le
> tableau, redimentionner ce dernier et ajouter le nouveau
> dossier, mettre la variable blnReprise à True pour
> reprendre la recherche.
>
> Une fois la rechercher terminée, on récupére un tableau
> avec chaque sous-dossier du sous-dossier, etc ...
> A partir de là, on peut explorer recursivement chaque
> dossier du tableau pour récuperer les fichiers présents.
>
>
> **********************************************************
> Private Function f_MoveDossier()
> Dim sDossiers(), sDossier As String
> Dim i, j, k, l As Integer
> j = tabMoveDossier(0)
> Dim blnExist, blnReprise As Boolean
>
> blnReprise = False
> For i = 1 To j
> sDossiers = Directory.GetDirectories
> (tabMoveDossier(i))
> For Each sDossier In sDossiers
> blnExist = False
> For k = 1 To j
> If (tabMoveDossier(k) = sDossier) Then
> blnExist = True
> Exit For
> End If
> Next
> If (blnExist = False) Then
> l = tabMoveDossier(0) + 1
> ReDim Preserve tabMoveDossier(l)
> tabMoveDossier(0) = l
> tabMoveDossier(l) = sDossier
> blnReprise = True
> End If
> Next
> Next
> If (blnReprise = True) Then f_MoveDossier()
> End Function
> **********************************************************
>
> Ne pas oublier de reinitialiser le tableau avant de faire
> une nouvelle recherche :
>
> Dim tabReset(1) As String
> tabMoveDossier = tabReset
> tabMoveDossier(0) = 1
> tabMoveDossier(1) = "Path_Dossier_à_Explorer"
>
>
> Voila, c'est surement pas ce qui se fait de mieux, mais
> si quelqu'un a une meilleure solution, je suis preneur.
>
> PS : Si vous pensez à la methode Directory.Move, il faut
> savoir que celle-ci n'est valable que lorsque la source
> et la destination se trouvent sur le même lecteur. Elle
> ne fonctionne pas pour deplacer des fichiers du lecteur
> C: au lecteur D:.
>
> Laurent




Avatar
Nicolas B.
Merci à tous les deux, ça fonctionne :-)


A+
--
Nicolas B.


Zoury a écrit :
Salut à vous! :O)

Il suffit de faire une fonction recursive.. mais c'est presque déjà
tout fait.. ;O)

'***
Imports System.IO

Module Module1

Sub Main()

' On liste les fichiers existants selon nos critères
PrintFilesList("D:DeveloppementGco.OlymSync.Bocenor",
"*.sln", True)

' Permet de voir les résultats avant de quitter..
Console.WriteLine()
Console.WriteLine("Press Enter to quit...")
Console.ReadLine()

End Sub

' Imprime la liste des fichiers trouvées,
' fonctionne de manière récursive si désirée
Private Sub PrintFilesList(ByRef SearchPath As String, ByRef
SearchPattern As String, ByRef IsRecursive As Boolean)

' Conserver la liste des fichiers et des répertoires
' contenus dans le répertoire courant [SearchPath]
'
Dim sFiles() As String = Directory.GetFiles(SearchPath,
SearchPattern)
Dim sFolders() As String = Directory.GetDirectories(SearchPath)
Dim sFile As String
Dim sFolder As String

' Imprime le nom des fichiers trouvés
'
If (sFiles.Length > 0) Then
For Each sFile In sFiles
Console.WriteLine(sFile)
Next
End If

' On rappelle la fonction avec les sous-répertoires
' du répertoire courant si nécessaire..
If (IsRecursive AndAlso sFolders.Length > 0) Then
For Each sFolder In sFolders
PrintFilesList(sFolder, SearchPattern, IsRecursive)
Next
End If

End Sub

End Module
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"Nicolas B." a écrit dans le
message de news:
Merci, Laurent.

Je testerai ça demain. C'est quand même bizarre qu'il n'existe pas de
fonction toute faite (comme FileSearch en VBA).


A+
--
Nicolas B.


Laurent B a écrit :
Salut,
J'ai eu ce probléme et j'ai été obligé de bidouiller une
fonction, c'est surement pas le meilleur mais ça marche :

1) Declarer un tableau de type string :

Public tabMoveDossier() As String

2) Ensuite remplir le tableau avec 2 valeurs avant
d'appeler la fonction :

tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"

3) Appeler la fonction

4) LA FONCTION :

Explorer récursivement chaque dossier qui sera mémorisé
dans le tableau et testé si chaque réponse à déjà eté
prise en compte. Si la réponse n'est pas mémorisée par le
tableau, redimentionner ce dernier et ajouter le nouveau
dossier, mettre la variable blnReprise à True pour
reprendre la recherche.

Une fois la rechercher terminée, on récupére un tableau
avec chaque sous-dossier du sous-dossier, etc ...
A partir de là, on peut explorer recursivement chaque
dossier du tableau pour récuperer les fichiers présents.


**********************************************************
Private Function f_MoveDossier()
Dim sDossiers(), sDossier As String
Dim i, j, k, l As Integer
j = tabMoveDossier(0)
Dim blnExist, blnReprise As Boolean

blnReprise = False
For i = 1 To j
sDossiers = Directory.GetDirectories
(tabMoveDossier(i))
For Each sDossier In sDossiers
blnExist = False
For k = 1 To j
If (tabMoveDossier(k) = sDossier) Then
blnExist = True
Exit For
End If
Next
If (blnExist = False) Then
l = tabMoveDossier(0) + 1
ReDim Preserve tabMoveDossier(l)
tabMoveDossier(0) = l
tabMoveDossier(l) = sDossier
blnReprise = True
End If
Next
Next
If (blnReprise = True) Then f_MoveDossier()
End Function
**********************************************************

Ne pas oublier de reinitialiser le tableau avant de faire
une nouvelle recherche :

Dim tabReset(1) As String
tabMoveDossier = tabReset
tabMoveDossier(0) = 1
tabMoveDossier(1) = "Path_Dossier_à_Explorer"


Voila, c'est surement pas ce qui se fait de mieux, mais
si quelqu'un a une meilleure solution, je suis preneur.

PS : Si vous pensez à la methode Directory.Move, il faut
savoir que celle-ci n'est valable que lorsque la source
et la destination se trouvent sur le même lecteur. Elle
ne fonctionne pas pour deplacer des fichiers du lecteur
C: au lecteur D:.

Laurent