Recherche Fichier(s) dans Disque/Répertoire/Sous-repertoire ...ultra rapide ...
Christ_OFF
Messages postés18Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention11 juin 2012
-
11 avril 2008 à 01:25
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023
-
14 avril 2008 à 08:44
Bonjour,
A vrai dire ce n'est pas une question mais une interrogation.
Mon but : Rechercher tous les fichiers "Thumbs.db" sur un Disque ou un Repertoire(+sous-repertoires) et lister leur emplacement dans un fichier.
J'avais déjà fait un fait un tel programme en TurboBasic (il y a très longtemps) et j'avais opté pour une commande DOS (c'est tout ce que j'avais à l'époque) du style "DIR C:\ Thumbs.db /s /b >FicTemp.txt"
Cette commande liste l'ensemble des "Thumbs.db" présent dans C:\ et les sous-repertoires et stocke le résultat dans "FicTemp.txt"
En voulant, le refaire sous VB6, j'ai opté pour un FSO (plus moderne), et oh stuppeur, mon traitement était 10 fois lent que ma préhistorique commnde DOS. Faites l'essai du DOS dans une fenêtre de commande, vous serez surpris de la rapidité du résultat (ce qui peut peut-être s'expliquer par le fait qu'on est plus près du langage machine que le VB)
J'ai donc transposé cette commande DOS sous VB6. Mais ceci implique de détecter la fin du traitement DOS avant de poursuivre l'éxécution du VB6.
J'ai trouvé le remède sur "http://www.codyx.org" et le résultat est incroyablement rapide et très court en ligne de programmation.
Private Sub Command1_Click()
Dim DirThumb As String
'Environ$("comspec") permet de trouver Command.exe suivant la version Windows
'/b affiche une liste sous un format abregé (juste une liste bien propre des emplacement)
'/s Scanne les sous-répertoire
DirThumb = Environ$("comspec") & " /c dir C:\thumbs.db /s /b > FicTemp.txt"
'commande dos, fenêtre cachée, synchrone
ShellAndWait DirThumb, WshHide, True
' OU
'commande dos, fenêtre cachée, synchrone
ShellAndWaitNoRef DirThumb, 0, True
End Sub
' 2 façon de tester l'exécution : AVEC ou SANS une référence à Windows Script Host Object Model (wshom.ocx)
Private Sub ShellAndWait(ByVal PathName As String, _
Optional ByVal WindowStyle As WshWindowStyle = WshMinimizedFocus, _
Optional ByVal WaitOnReturn As Boolean = False)
'nécessite une référence projet à la bibliothèque Windows Script Host Object Model (wshom.ocx)
Dim wshTemp As IWshRuntimeLibrary.IWshShell
'instancie l'objet WShell
Set wshTemp = New IWshShell_Class
'lance la commande
wshTemp.Run PathName, WindowStyle, WaitOnReturn
'affiche la boite de dialogue de fin
MsgBox "Fin"
'libère l'objet
Set wshTemp = Nothing
End Sub
OU
Private Sub ShellAndWaitNoRef(ByVal PathName As String, _
Optional ByVal WindowStyle As Integer = 2, _
Optional ByVal WaitOnReturn As Boolean = False)
'NE nécessite PAS de référence projet à la bibliothèque Windows Script Host Object Model (wshom.ocx)
Dim wshTemp As Variant
'instancie l'objet WShell
Set wshTemp = CreateObject("WScript.Shell")
'lance la commande
wshTemp.Run PathName, WindowStyle, WaitOnReturn
'affiche la boite de dialogue de fin
MsgBox "Fin"
'libère l'objet
Set wshTemp = Nothing
End Sub
J'ai donc opté pour cette version et je la publie sur ce forum pour partager cette "trouvaille" (je dois bien cela, avec tout ce que j'ai trouvé ici :-) )
Cette option de recherche de fichier n'est effectivement pas très "VB" et est peut-être faite pour des vieux comme moi qui ont débuter avec le DOS 3.0 (en 1979!), mais au vu du résultat ultra-rapide, je ne comprends pas qu'elle soit aussi peu cité.
A moins qu'elle possède un inconvénient que je n'aurai pas détecté !
A vous de juger et de l'adopter si vous en êtes convaincu (moi c'est fait ).
radcur
Messages postés282Date d'inscriptionlundi 29 septembre 2003StatutMembreDernière intervention15 août 20122 11 avril 2008 à 05:43
salut
même si FSO est plus moderne, il se traine les pieds. C'est très lent à utiliser...
il doit exister des sources sur le site pour la recherche de fichiers et qui utilise la récursivité et qui doit être plus performant que FSO avec un temps réponse plus près de DOS mais plus moderne que DOS.
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 11 avril 2008 à 11:32
Bonjour
Tu peux voir su www.codyx.org, il y a 2/3 snippets qui en parle.
Et c'est vrai, évite FSO en VB6, il y a la commande Dir$(...), mais je ne sais pas si c'est la meilleur solution.
Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
Christ_OFF
Messages postés18Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention11 juin 2012 11 avril 2008 à 18:49
Bonjour,
Attention, sauf erreur, la commande DIR$( ) ne scanne pas dans les sous-répertoires contrairement au DIR du DOS.
Rappel :
DIR C:\*.exe /s /b >ListFich.txt écrit dans le fichier ListFich.txt, la liste de tous les emplacements des fichiers *.EXE présents dans les répertoires et sous-répertoires de C:\.
exemple de résultat dans ListFich.txt
C:\toto.exe
C:\Program Files\Adobe\AcroRd32.exe
C:\Program Files\Asus\AsusProb.exe
...
C:\Windows\notepad.exe
C:\Windows\calc.exe
...
(A noter que l'option ShellAndWait (décrite ci-dessus) n'est pas obligatoire.
Elle est est utile seulement si, par exemple, on veut détruire le fichier après lecture du résultat et que le Shell a été moins rapide que le VB)
Je pense que la commande DIR du DOS ne lit que la FAT qui est déjà un listing, et donc très facile à filtrer une recherche.
Contrairement à tout ce que j'ai pu trouvé sur le net, où on effectue une recherche récursive, de répertoire en répertoire,
et forcément beaucoup plus lente quelquesoit le procédé utilisé (FSO ou autre).