DIR RÉCURSIF MULTI-FILTRES EN UNE SEULE PASSE [MODULE / MODULE DE CLASSE]

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 8 juil. 2008 à 16:27
gnomish Messages postés 3 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 12 décembre 2013 - 30 janv. 2010 à 00:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47243-dir-recursif-multi-filtres-en-une-seule-passe-module-module-de-classe

gnomish Messages postés 3 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 12 décembre 2013
30 janv. 2010 à 00:47
Cela date un peu, mais tout à fait ce que je cherchais, cependant en version unicode il me retourne un caractère en moins en fin de fichier. En traçant le programme, je crois que la fonction TrimRNullW enlève un vbNull de trop à droite, et devrait s'écrire TrimRNullW = Left$(sString, InStr(sString, vbNullChar & vbNullChar))
Du coup certains tests sont faux dans DirPlusW, car ils ajoutaient le vbNull enlevé selon qu'il s'agissait d'un répertoire ou fichier...
.FileOrFolder = .FileOrFolder & vbNullChar & "" & vbNullChar
et plus loin
sTempPath = sTempPath & vbNullChar & "" & vbNullChar
Les deux tests deviennent ainsi inutiles, il suffit de ne laisser qu'une ligne et d'enlever le vbNullChar avant le "" pour avoir :
If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' c'est un dossier
.FileOrFolder = .FileOrFolder & "" & vbNullChar
.IsDirectory = True
End If

et plus loin

If (tWFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
' extraction nom dossier en évitant les "." et ".."
sTempPath = TrimRNullW(tWFD.cFileName)
If IsValidDirPlusW(sTempPath) Then
' récursivité, mais on peut très bien avoir un dossier vide
sTempPath = sTempPath & "" & vbNullChar

Et pour IsValidDirPlusW il faudrait plutôt écrire :
IsValidDirPlusW = ((sString <> StrConv(".", vbUnicode))) And (sString <> StrConv("..", vbUnicode))
(enfin, en utilisant des constantes ce serait mieux pour éviter les appels de StrConv à chaque fois)

En faisant cela, tout rentre dans l'ordre et unicode ou pas la classe marche à merveille (je n'ai pas testé le module).
Sans quoi je trouve le code très utile car il permet de se passer des composants.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 juil. 2008 à 19:17
FM20.dll (composants Form2.0) permet d'afficher les caractères unicode

aucun intérêt d'utiliser une DirListBox puisque le but est de ne pas passer par des composants

aucun intérêt d'utiliser le DIR classique puisqu'il ne traite pas l'unicode

aucun intérêt de tester la rapidité d'une boucle sans filtre puisque ce n'est pas le but de la source.

donc rien de constructif, fausses infos, faux tests.

tu vois, même en te laissant un droit de réponse (et donc de rester), tu ne sais pas en profiter utilement FMAPI....
tanpis, y'a des cas comme çà où la raison ne l'emportera jamais
VBtoTRASH Messages postés 59 Date d'inscription vendredi 18 juillet 2008 Statut Membre Dernière intervention 31 mars 2011
18 juil. 2008 à 18:59
Non, la dll manquante est FM20.dll ... pas FMAPI.dll!
Cà existe cette dll ?
Et je ne vois pas ce que ce BOUC EMISSAIRE vient faire ici!
Bon!
Pour accélérer ta recherche, tu crées une classe de recherche avec 1 seul paramétrage possible, tu ouvres sur ta feuille une Collection, et tu lances ta collection de recherche. C'est très rapide!
Dans la classe, tu place une routine récursive SIMPLE avec le DIR classique, planifié avec une DirListBox.

Rapidité : 5 secondes pour trouver 10000 fichiers d'un disque dur de 1/2 To via USB2.0.
Avec SATI ... je pense, moins d'une seconde.

A toi de voir : Beau ou efficace, à toi de voir
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
18 juil. 2008 à 18:26
Bah! Pour le skin, on aime ou pas, on retient ou non quelques lignes de prog. De toute façon, elle est indépendante de la fonction concernée.
Perso, ce skin est un petit 'plus'.

VBtoTRASH : Pour quelqu'un qui vient de s'inscrire aujourd'hui même, tu n'es pas très constructif dans tes propos. Tu me laisses sur ma faim car tu n'as pas donné de solution (constructive).
Au fait, n'oublie pas qu'ici, on parle de VB.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 juil. 2008 à 16:23
titicar -> merci pour ton comm. je vais tout de même revoir le code (un peu plus tard) pour qu'il soit un peu plus rapide

VBtoTRASH -> pour l'interface je me demande aussi...
pour le reste, j'vais te laisser te trouver un autre bouc émissaire FMAPI...
VBtoTRASH Messages postés 59 Date d'inscription vendredi 18 juillet 2008 Statut Membre Dernière intervention 31 mars 2011
18 juil. 2008 à 15:56
Pourquoi faire compliqué (API,Skin ...) quand on peut faire beaucoup plus simple et surtout efficace.
Pas de paramétrage ... plante à tous vents ... source sans intérêt ... dll manquante ... la liste est longue.

A mettre dans le récipient du dessus!
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
17 juil. 2008 à 19:21
Merci PCPT,ça marche tout simplement très bien.
Ta source est nettement plus pratique et plus rapide comparé à ce que j'utilise actuellement.
Je n'ai pas essayé le projet 'module'. Les class, c'est tout de même plus flexible.

Par curiosité, dans la prop. Filters, j'ai essayé :
- "r*.dll" -> Ca marche nickel
- "re*.mp3" -> Ca m'affiche tout ce qui commence par 're', mais aussi ce qui commence par 'r.e'
- "r.e*.mp3" -> Ca marche nickel
Je suppose que c'est FindFirstFileA qui gère ça ainsi.

Sinon, c'est courageux de s'attaquer à l'UNICODE sous VB6 car c'est vraiment pas évident pour l'affichage.

Je note 10 car je n'ai pas vu mieux.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
13 juil. 2008 à 18:38
Maj à la demande de Kenji => les fonctions sont maintenant ASCII ou Unicode
paramètre pour le module, propriété pour la classe

pas mal de tests et çà a été moins évident que je ne le pensais mais çà a l'air d'être bon
(enfin j'espère ^^)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
8 juil. 2008 à 22:57
Bien
Utilisateur anonyme
8 juil. 2008 à 22:15
Aller, une petite remarque, désolé, je devient un peu maniaque la dessus (à force de bosser sur des système en jap) : ca gère pas l'unicode. Si j'ai un dossier qui contient des caractère en unicode, il n'est pas traité.

Sinon, très bonne source. Ca m'évitera de refaire un module de listing à chaque fois.
Bon coding.
__
Kenji
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 juil. 2008 à 18:05
maj, voir détails histo 08 juillet 2008 18:03:20

toutes tes demandes sont faites ;)
(m'étais aussi gouré dans les dates description + un pavé de code en commentaire)

++ ;)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
8 juil. 2008 à 16:50
Salut Mortalino,

merci pour ton comm et note ;)

1/ RECT -> ohohoh ouai c'est facile :D
ce vieux usercontrol fait à l'arrache^^. ok c'est supprimé mais c'est drôle, je n'avais jamais essayé le "examiner le code source" directement sur le VBP, astuce pratique merci :p

2/ ok je regarde çà en propriété

3/ va pour un tooltip (je pensais pourtant que 2 lignes suffisaient. çà reste néanmoins que de l'interface tout çà ;))

4/ 260&
oui c'est surtout conventionnel.
en fait MAX_PATH attend un long (puisque déclarée en long)
MsgBox VarType(260) ' => vbInteger
tandis que
MsgBox VarType(260&) ' => vbLong

c'est d'ailleurs la même chose en hexa avec '&H104' et '&H104&'
donc on donne juste ce que la variable attend ;)

je modifie tout çà au plus vite ;)
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
8 juil. 2008 à 16:27
salut PCPT,

sympa cette source, peut être très utile ;)

Pas grand chose à dire concernant ton code (pas assez avancé pour me permettre), cependant (et oui, il y a toujours un 'mais') :

1/ (facile :D) type RECT pas utilisé (merci MZ-tools)
2/ J'aurais bien aimé avoir indépendamment une propriété Filter (pour la classe). Cela serait plus facile pour réutiliser ta class.
3/ Si le nom du dossier + fichier est long, il n'apparait pas entièrement dans le Lbl_Path, ni dans le LB_Result. TooltipText ? (ou autre)

Pour comprendre, un moment j'ai vu que pour l'attribution de valeurs à tes constantes (valeurs décimales), tu mettais le '&'. Y'a t-il une raison particulière ? (ou c'est une façon conventionnelle d'attribuer une valeur comme ceci)
ex : [Private Const MAX_PATH As Long = 260&]

A part ça, code excellent (bien codé et bien commenté), et je trouve que la recherche se fait très rapidement, bien qu'apparemment ce n'était pas le but :)

Bonne continuation
@++
Rejoignez-nous