Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres Tests de diverses solution pour lister dans un dialog perso des fichiers en filtrant par expression et extension

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
si il y a des âmes charitables qui voudraient bien tester ma pseudo boite de dialogue fichier avec filtre ca m'arrangerait
en fait je l'ai créée sous trois formae différente

1° la filedilogspecial1
avec un dir en ligne de commande lancée par wscript.shell(.excec) et récupérée par le stdout.readall
ce qui implique une apparition brève mais tout de même de la fenêtre dos

2° la filedilogspecial2
avec un dir en ligne de commande lancée par wscript.shell (.run)et récupérée dans un fichier text temporaire
ce qui implique que la fenêtre dos n'apparait pas puisque je hide la fenêtre

3° la filedilogspecial3
dans celle ci j'utilise un hersats de ma fonction FSOGOSUB de 2021 avec FSO

tout les argument sont optionnels
le choix du fichier se fait au double click
possibilité d'annuler

vous avez 3 module pour tester chaque version
si vous pouviez donc tester la testA4 , TestB4 , TestC4 qui sont selon moi les plus importantes
et me dire si la différence de temps d'apparition de la fenêtre avec la liste de fichier filtrée avec les arguments envoyés par les sub de testsest importante ou pas
voir même cela vous gène t il plus que ça (que la fenêtre dos apparaisse brièvement (pour la fildialoSpecial1) )?

merci aux testeurs
après moult tests dans diverses situations la version 5 et celle qui a été retenu
 

Pièces jointes

  • boite de dialog recherche de fichier V1 2 3 4 5 6.xlsm
    151.1 KB · Affichages: 1
Dernière édition:
Solution
bon après moults test dans diverses conditions pour la boites de dialog ce sera la petite dernière que j'ai un peu montré dans la vidéo
c'est pas la plus rapide mais

1° version 1 la méthode cmd Dir--> stdout readall ayant un problème de formatage et affichant la fenêtre de cmd vous l'avez compris de toute façon c'est la première a avoir été abandonnée

2° Version 2 méthode cmd dir --> fichier temporaire est acceptable mais selon l'occupation du pc elle peut varier su simple à X 7 a peu prés et elle exige forcement que au moins la destination du fichier soit autorisée pas simple sur pc pro voir même privé logué avec compte MS sur windows

3° version 3 FSO elle fonctionne très bien mais elle est plus lente que les autres mais je...

patricktoulon

XLDnaute Barbatruc
et en plus j'ai libré le mauvais modele pour la 4
en fait là vous avez pas la récursivité optionnelles elle est en recursive tout le temps
Voila le bon modèle
milles excuses pour la bevu
a force de compiler des exemple on fini par s’emmêler les pinceaux

la sub GO_click dans son entièreté
VB:
Public Sub go_Click()
    Dim Chemin As String, partNom As String, Recurr As String, liste As String, extension As String, tempFile, X, i As Long, tim
    Dim m
    Const MSG_CHEMIN_VIDE As String = "Veuillez d'abord choisir un dossier parent à examiner"
    Const MSG_LISTE_VIDE As String = "La liste n'a pas pu être récupérée." & vbCrLf & _
                                      "Ou il n'y a pas de fichier avec cette extension" & vbCrLf & _
                                      "Vérifiez vos paramètres." & vbCrLf & _
                                      "Et éventuellement les autorisations de votre système pour le wscript."

    tempFile = Environ("userprofile") & "\desktop\temp_output.txt"

    ListBox1.Clear

    Chemin = TxtbFolder ' Le folder dans le textbox

    With ListBox1
        If Chemin = "" Then
            .AddItem MSG_CHEMIN_VIDE:
            .BackColor = &HC7BBA0
            .Enabled = False
            Exit Sub
        End If

        If Dir(Chemin, vbDirectory) = "" Then
            .AddItem "Ce dossier racine est introuvable": valeur = False:
            .BackColor = &HC7BBA0
            .Enabled = False
            Exit Sub
        End If
    End With

    If Right(Chemin, 1) <> "\" Then Chemin = Chemin & "\" ' On prévoit le séparateur si nécessaire

    ' Paramètres de recherche
    ' Expression dans la partie du nom
    partNom = Replace(TxtbExpression, "*", "%")
    extension = Replace(TxtbExtension, "*", "%")

    'switch pour la récursivité
    If Checkrecursif = False Then
       'il ne doit pas  y avoir plus d'antislashs que le chemin de depart en non recursif
        X = Application.Rept("%\", UBound(Split(Chemin, "\")) + 1)
        Recurr = "AND System.ItemPathDisplay NOT LIKE '" & X & "%' "
    End If


    'Archive Octobre 2024 ;modèle patricktoulon  requete windowsearch V 4
    On Error GoTo ErrorHandler

    Dim Debut As Currency, Fin As Currency, Freq As Currency
    QueryPerformanceCounter Debut
    Dim objConnection As Object, objRecordset As Object
    Dim j As Integer
    Dim montableau, mess As String


    ' Création des objets ADODB
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordset = CreateObject("ADODB.Recordset")


    ' Ouverture de la connexion
    objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
    ' Requête SQL avec les paramètres
    objRecordset.Open "SELECT System.ItemPathDisplay , System.ItemName, System.DateModified FROM SYSTEMINDEX " & _
                       "WHERE System.ItemPathDisplay LIKE '" & Chemin & "%' " & _
                       "AND System.ItemName LIKE '%" & partNom & "%' " & Recurr & _
                       "AND System.ItemName LIKE '%." & extension & "%'", objConnection

    ' Extraction des données et affichage
    If Not objRecordset.EOF Then
        montableau = objRecordset.GetRows()
        m = Transpose2dim(montableau)
    Else
        ReDim m(0) ' La ListBox accueille le split de la variable Liste
    End If

    QueryPerformanceCounter Fin
    QueryPerformanceFrequency Freq
    dt = Format(((Fin - Debut) / Freq), "0.000") & " s"

    With ListBox1
        If UBound(m) > 0 Then
            .List = Application.Index(m, 0, 1)
            labelcount = .ListCount & " Fichiers trouvés en " & dt
            .BackColor = vbWhite
        Else
            .List = Split(MSG_LISTE_VIDE, vbCrLf): ListBox1.Enabled = False
            .BackColor = &HC7BBA0
        End If
    End With
Cleanup:
    ' Fermeture des objets
    On Error Resume Next
    objRecordset.Close
    objConnection.Close
    Set objRecordset = Nothing
    Set objConnection = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "Erreur : " & Err.Description, vbCritical
    Resume Cleanup
End Sub

merci @jurassic pork pour m'avoir titiller , j'aurais laisser comme ça sinon c'est Balloh!!
 

laurent950

XLDnaute Barbatruc
Re Patrick,

Ton explication est claire et limpide. Tu as fait un travail de recherche remarquable avec ces 4 codes, qui ont mis en lumière le code 5 que je pourrais qualifier en un mot : impressionnant.

Merci pour cette explication très utile. Après avoir manipulé les différents codes, je vois toute la pertinence de ce programme, dédié à faire des recherches sur des fichiers noyés dans la masse, que l'on n'arrive jamais à retrouver avec le système Windows, trop lent et décourageant après de multiples essais... Avec ce système, c'est juste impressionnant et efficace.

Merci encore, Patrick.
@patricktoulon
Laurent
 

ChTi160

XLDnaute Barbatruc
Bonsoir Patrick
dans cette procédure j'ai un probléme avec le "M_timer "
VB:
Sub test()
  
    ' Lancer le chronométrage pour la Sub test
    StartExecTimeMonitoring "démarrage de la sub test", report, debut, 1
  
    x = mafonction
    
    M_timer
    ' Afficher le rapport
    MsgBox report
End Sub
c'est quoi est-ce ? Lol
Jean marie
 

laurent950

XLDnaute Barbatruc
Re @patricktoulon,

J'ai essayé de mon côté, et j'arrive à un résultat, mais en 1,50 secondes, alors que toi, c'est autour de 0,08 secondes. C'est déjà pas mal ! J'ai trouvé un principe qui vaut ce qu'il vaut, je vais continuer à étudier tout cela.

Ce soir, je fais une pause, je suis complètement Excélisé

Encore une fois, merci ! Je vais poursuivre, c'est très intéressant.
 

patricktoulon

XLDnaute Barbatruc
@ChTi160
bonsoir jean marie
un rattage de copier coller
VB:
Sub test()
    
    ' Lancer le chronométrage pour la Sub test
    StartExecTimeMonitoring "démarrage de la sub test", report, debut, 1
    
    x = mafonction
      
     StopExecTimeMonitoring "fin de la sub test", report, debut, 1
 ' Afficher le rapport
    MsgBox report
End Sub

@laurent950 quand tu le lance plus fois ça donne quoi?
 

patricktoulon

XLDnaute Barbatruc
@laurent950
quel code 1 2 3
tu n'a que 2 tests a faire je te redonne le fichiers
avec donc la NewDir et l'ancienne méthode que j'utilisais remis au gout du jour
et du coup elle redevient la plus rapide d'une poussière de rien du tout
le secret c'est de vider en cours de route la collection
et de charger le return (pour la vielle récursive) quand elle revient l'instance 1 de la fonction


dans mon disque
363 dossiers et sous dossiers
2634 fichiers

pour la petite nouvelle methode newdir
1° recherche sélective expression , sans extension et recursif à true =65 ms pour 59 fichiers trouvés
2° recherche sélective expression , sans extension et recursif à false=13 ms pour 20 fichiers trouvés
3° listage complet du disque 70 ms pour 2589 fichiers trouvés
4° listage non recursif juste la racine 17 ms pour 717 fichiers

l'ancienne methode la Old
1° recherche sélective expression , sans extension et recursif à true =66 ms pour 59 fichiers trouvés
2° recherche sélective expression , sans extension et recursif à false=13 ms pour 20fichiers trouvés
3° listage complet du disque 69 ms pour 2589 fichiers trouvés
4° listage non recursif juste la racine 15 ms pour 717 fichiers
 

Pièces jointes

  • Demo New fonction DIR recursivité on collection methode d'empilement.xlsm
    30.8 KB · Affichages: 5

jurassic pork

XLDnaute Occasionnel
Hello,
en faisant des tests avec la nouvelle méthode je me suis aperçu qu'elle ne renvoyait pas le même nombre de fichiers que la version 1 et 2 (avec cmd), il y en a moins. J'ai regardé les fichiers qui étaient absents : Les fichiers qui commencent par . ce qui est normal par rapport à ton code mais il y a aussi les fichiers sans extension (comme LICENSE par exemple). Si on met dans ton code Optional Ext = "*" au lieu de Optional Ext = "*.*", je récupère bien les fichiers sans extension. Il y a aussi le fait que les fichiers n'ont pas le même ordre qu'avec la version 1 ou 2 mais cela ne pose pas un problème car on peut trier.
Ami calmant, J.P
 

jurassic pork

XLDnaute Occasionnel
donc si je pige le truc l'extension par defaut c'est "*" comme pour part?
hello patricktoulon, ben oui en tout cas chez moi cela fonctionne. Sinon pour le problème des fichiers qui ne sont pas dans l'ordre cela se produit surtout quand il y a beaucoup de répertoires et de fichiers dans les résultats. Exemple (partie) :

là on voit un seul fichier dans le répertoire SharpDevelop alors qu'on en retrouve pleins d'autres ailleurs dans les résultats.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
je monte chez moi de 2624 a 2629 fichier sur le disque que je test habituellement

et sur C:\Program Files

version 1 : (tout fichier) 23544 fichiers en 1.628 sec
version 2 : (tout fichier) 23544 fichiers en 1.185 sec
version 3 : (tout fichier) 23542 fichiers en 9.960 sec
Version 4 : (ne marche pas sur program Files)( i dont know why)
version 5 : (tout fichiers) de 22884 à 23334 fichiers en 1,882 sec
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…