Recherche Fichier(s) dans Disque/Répertoire/Sous-repertoire ...ultra rapide ...

Signaler
Messages postés
18
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
11 juin 2012
-
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
-
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 ).

Christ_OFF

4 réponses

Messages postés
282
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
15 août 2012
2
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.
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
156
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
Messages postés
18
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
11 juin 2012

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).

Ch.
Messages postés
14808
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 juillet 2021
156
Bonjour

Connaissait pas ces commutateurs de la commande Dir, merci, ce me sera peut être utile plus tard.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site