OVH Cloud OVH Cloud

Lecture de répertoire et récursitivité

26 réponses
Avatar
Blaise Cacramp
Bonjour

Purée que l'on devient vite vieux.

Bon ben je bloque pour la lecture des répertoires ( dossiers et
sous-dossiers ) en VB6.


Merci beaucoup, Papy Blaise

10 réponses

1 2 3
Avatar
Blaise Cacramp
"Jean-marc" a écrit dans le message
news: eqkr70$snh$
Blaise Cacramp wrote:
> Purée, suis-je con ce WE. Pour preuve (de ma connerie actuelle et de
> mon savoir) ce petit machin de moi :
> http://www.ubiq.be/initiation/index.html

Non non, pas con du tout! On a tous des baisses de forme :-)

Sympathique ton site, bien fait, sobre, clair et didactique.

j'ai même appris qu'on avait inventé le "kibi"! (mon dieu ...)





Venant d'un MVP... merci !

Et pour le kibi, désolé !
Avatar
Blaise Cacramp
"Jean-marc" a écrit dans le message
news: eqinan$33o$
Blaise Cacramp wrote:
> Bonjour
>
> Purée que l'on devient vite vieux.
>
> Bon ben je bloque pour la lecture des répertoires ( dossiers et
> sous-dossiers ) en VB6.
>
>
> Merci beaucoup, Papy Blaise

Bonjour/Bonsoir,

On peut lister les fichiers et répertoires avec la fonction Dir$
Hélas, celle-ci n'est pas réentrante et ne peut donc pas être
appellée récursivment.


Pour cela, on doit alors employer 2 fonctions de l'API Windows,
FindFirstFile et FindNextFile, ces 2 fonctions permettant elles
les apples récursifs.

Tu trouveras ici une implémentation complète en VB d'une fonction
de recherche récursive utilisant les 2 fonctions sus-citées.

http://docvb.free.fr/apidetail.php?idapiF

Bien cordialement,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/





Ouaaaais...

super lent ce truc. Incroyable. C'est fait exprès ?

Pascal
Avatar
Jean-marc
Blaise Cacramp wrote:
"Jean-marc" a écrit dans le
message news: eqinan$33o$
Blaise Cacramp wrote:
Tu trouveras ici une implémentation complète en VB d'une fonction
de recherche récursive utilisant les 2 fonctions sus-citées.

http://docvb.free.fr/apidetail.php?idapiF



Ouaaaais...

super lent ce truc. Incroyable. C'est fait exprès ?



Hello,

Lent dis tu? C'est vrai que ce n'est pas hyper optimisé mais
je n'ai jamais constaté de lenteur excessive...

Sur quel genre de recherches?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
Blaise Cacramp wrote:
"Jean-marc" a écrit dans le
message news: eqinan$33o$
Blaise Cacramp wrote:
Tu trouveras ici une implémentation complète en VB d'une fonction
de recherche récursive utilisant les 2 fonctions sus-citées.

http://docvb.free.fr/apidetail.php?idapiF



Ouaaaais...

super lent ce truc. Incroyable. C'est fait exprès ?



Hello,

Lent dis tu? C'est vrai que ce n'est pas hyper optimisé mais
je n'ai jamais constaté de lenteur excessive...

Sur quel genre de recherches?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
Jean-marc wrote:
Lent dis tu? C'est vrai que ce n'est pas hyper optimisé mais
je n'ai jamais constaté de lenteur excessive...

Sur quel genre de recherches?



Pour compléter, voici un test fait chez moi:
recherche de *.doc dans un répertoire comprenant
1160 sous dossiers (jusqu'à 7 niveaux d'arborescence) et
12943 dossiers.

Résultat: 97 fichiers trouvés, en moins d'une seconde (800 ms).

Note: cette fonction a été écrite pour *Rechercher*, ce qui veut dire
qu'elle est plutot écrite pour examiner très vite, et pas nécessairement
pour stocker efficacement.

Si tu t'en sers pour lister (donc recherche de *.*), il faut
modifier la fonction proposée car elle est très (très!) pénalisée par
la manière dont elle gère l'allocation dynamique avec Redim Preserve ...

Redim Preserve est un vrai carnage pour le processeur, si tu sais
comment marche Redim Preserve sous le capot ...

Si tu en fais ce genre d'utilisation, il faut modifier cette gestion
mémoire: préallocation par blocs, etc. Très fun à faire :-)

Bonne prog!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Blaise Cacramp
Comme de fait, c'est pour la liste complète (recherche de doublons)

Il y a donc lecture complète - et c'est vrai que cela ralenti au fur et à
mesure dque cela prend de l'ampleur.
puis un tri
une comparaison
...
Avatar
Jean-marc
"Blaise Cacramp" wrote in message
news:
Comme de fait, c'est pour la liste complète (recherche de doublons)

Il y a donc lecture complète - et c'est vrai que cela ralenti au fur et à
mesure dque cela prend de l'ampleur.
puis un tri
une comparaison



Hello,

Si c'est pour du "one-shot", tu peux adapter la fonction
en virant les redim preserve et en faisant une écriture
"sauvage" dans un fichier au fur et à mesure.
Ca, c'est hyper rapide.
Tu peux aussi écrire dans un tableau global, préalloué.

en gros, tu vires ça:
ReDim Preserve ResultatRecherche.Chemin(1 To ResultatRecherche.Nombre)
ReDim Preserve ResultatRecherche.Fichiers(1 To ResultatRecherche.Nombre)
ResultatRecherche.Chemin(ResultatRecherche.Nombre) = Chemin
ResultatRecherche.Fichiers(ResultatRecherche.Nombre) = lpFindFileData

et tu remplaces par ça:
monGrosTableau(ResultatRecherche.Nombre)= chemin & "" & lpFindFileData

Bref tu vires tout ce qui ne sert pas.

Je n'ai pas testé en détail, mais à mon avis:

' Initialise lpFindFileData (Variable texte uniquement)
lpFindFileData.cAlternate = String$(14, 0)
lpFindFileData.cFileName = String$(MAX_PATH, 0)

Je pense qu'on peut sortir ça de la boucle.
Sinon, on peut quand précalculer
String$(14,0) et faire une simple affectation plutot
que de refaire un String$() à chaque fois.

Bref à mon avis, on peut gagner un énorme facteur en
adaptant un peu tout ça.


Pour le tri, QuickSort ou Shell sort au choix: sur
quelques centaines de milliers d'nentrées, ça sera très rapide
(qq secondes).

--
Jean-marc
Avatar
Blaise Cacramp
Merci Jean-Marc,

Okay pour le bloc comme expliqué par toi un autre jour (Google est mon ami)
Cela fait une lecture en 3 minuters au lieu de plus de trois heures pour
163000 fichiers...!

Par contre pour le tri (suivant procédure plus bas), cela ne prend pas
quelques secondes mais plutôt quelques dizaines de minutes (j'ai arrêté
après 30 minutes)

' ============================== TriRapide
================================== ' TriRapide prend un ,l,ment "pivot" al,atoire dans TableauTri, puis
' place d'un c"t, du pivot tous les ,l,ments qui lui sont sup,rieurs, et
' de l'autre tous ceux qui lui sont inf,rieurs. TriRapide est ensuite
' appel, de maniSre r,cursive avec les deux subdivisions cr,,es par le
' pivot. Quand le nombre d',l,ments d'une subdivision est ,gal . deux,
' les appels r,cursifs cessent et le tableau est tri,.
'
=========================================================================== '
Sub TriRapide(Bas, Haut, TableauTri() As Tableau)
Dim partition As String
Dim i As Long
Dim j As Long
Dim Bidon
Dim IndexAleat As Long


If Bas < Haut Then
' Seulement deux ,l,ments dans cette subdivision; les permuter s'ils
' ne sont pas class,s dans le bon ordre, puis mettre fin aux appels
' r,cursifs :
If Haut - Bas = 1 Then
If TableauTri(Bas).Ele > TableauTri(Haut).Ele Then
Swap TableauTri(Bas), TableauTri(Haut)
End If
Else
' S,lectionne un ,l,ment de pivot, de maniSre al,atoire, puis le
' d,place jusqu'. la fin :
IndexAleat = EntierAleat(Bas, Haut)
Swap TableauTri(Haut), TableauTri(IndexAleat)
partition = TableauTri(Haut).Ele
Do
Bidon = DoEvents()
' Ramener des c"t,s vers l',l,ment pivot :
i = Bas: j = Haut
Do While (i < j) And (TableauTri(i).Ele <= partition)
i = i + 1
Loop
Do While (j > i) And (TableauTri(j).Ele >= partition)
j = j - 1
Loop
' Si l',l,ment pivot n'a pas ,t, atteint, cela signifie que deux
' ,l,ments situ,s de part et d'autre de l',l,ment pivot sont mal
' class,s. Il faut alors les permuter :
If i < j Then
Swap TableauTri(i), TableauTri(j)
End If
Loop While i < j
' Remettre l',l,ment pivot . sa place correcte dans le tableau :
Swap TableauTri(i), TableauTri(Haut)
' Appeler de maniSre r,cursive la proc,dure TriRapide (passer
' d'abord la plus petite subdivision afin d',conomiser l'espace
' dans la pile) :
If (i - Bas) < (Haut - i) Then
TriRapide Bas, i - 1, TableauTri()
TriRapide i + 1, Haut, TableauTri()
Else
TriRapide i + 1, Haut, TableauTri()
TriRapide Bas, i - 1, TableauTri()
End If
End If
End If
End Sub
-------------
Function EntierAleat(Inferieur, Superieur)
EntierAleat = Int(Rnd * (Superieur - Inferieur + 1)) + Inferieur
End Function
-------------
Sub Swap(T1 As Tableau, T2 As Tableau)
Dim tmp As Tableau
tmp = T1
T1 = T2
T2 = tmp
End Sub
Avatar
Blaise Cacramp
Et les "folders" aussi.
plus drive, root, racine, ...

Le plus troll n'est pas celui qu'on crois(e) au détour d'un chemin mal famé.
Non, il est à vos côtés, insidieux. Regardez-moi, je viens d'en croiser un
et je troll deviens-je Haaarghhh


"LE TROLL" <le a écrit dans le message news:

Bonsoir,

Peux-tu préciser ce que tu veux aire, car il y a un paquet de


commandes,
tu parles de répertoires et de dossiers et de sous-dossiers, il me semble
bien que pour Dos il n'existe que des fichiers et des répertoires (sous
répertoires si on veut) ???

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur de MES ROMANS édités
http://irolog.free.fr/romans
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
--------------------------------------------------------------------------


----------
"Blaise Cacramp" a écrit dans le message de news:

> Bonjour
>
> Purée que l'on devient vite vieux.
>
> Bon ben je bloque pour la lecture des répertoires ( dossiers et
> sous-dossiers ) en VB6.
>
>
> Merci beaucoup, Papy Blaise
>
>




Avatar
Jean-marc
Blaise Cacramp wrote:

Hello,

Merci Jean-Marc,



Avec plaisir :-)

Okay pour le bloc comme expliqué par toi un autre jour (Google est
mon ami) Cela fait une lecture en 3 minuters au lieu de plus de trois
heures pour 163000 fichiers...!



Parfait! J'étais sur qu'on pouvait gagner beaucoup!


Par contre pour le tri (suivant procédure plus bas), cela ne prend pas
quelques secondes mais plutôt quelques dizaines de minutes (j'ai
arrêté après 30 minutes)




163000, c'est peu pour un tri rapide. Curieux que ce soit si lent.
La fonction que tu utilises n'est pas géniale, en particulier Swap
qui me semble bien couteux.

Voici un tri rapide assez bon (il te faut juste changer les Long en String:

'
' Tri Rapide - Quick Sort
' Based on original code : http://www.vb-helper.com/howto_quicksort.html
'
Public Sub Quicksort(t() As Long, _
ByVal loBound As Long, _
ByVal upBound As Long)

Dim med_value As Long
Dim hi As Long
Dim lo As Long
Dim i As Long

If loBound >= upBound Then Exit Sub
i = Int((upBound - loBound + 1) * Rnd + loBound)
med_value = t(i)
t(i) = t(loBound)
lo = loBound
hi = upBound
Do
Do While t(hi) >= med_value
hi = hi - 1
If hi <= lo Then Exit Do
Loop
If hi <= lo Then
t(lo) = med_value
Exit Do
End If
t(lo) = t(hi)
lo = lo + 1
Do While t(lo) < med_value
lo = lo + 1
If lo >= hi Then Exit Do
Loop
If lo >= hi Then
lo = hi
t(hi) = med_value
Exit Do
End If
t(hi) = t(lo)
Loop
' Recursive calls
Quicksort t(), loBound, lo - 1
Quicksort t(), lo + 1, upBound
End Sub


et au besoin, voici un Shell Sort (idem changer Long en String):

'
' Tri de Shell - Shell Sort
'
Public Sub ShellSort(t() As Long, _
Optional ByVal loBound As Long = -1, _
Optional ByVal upBound As Long = -1)

Dim i As Long, j As Long, h As Long, v As Long

If loBound = -1 Then
loBound = LBound(t())
End If
If upBound = -1 Then
upBound = UBound(t())
End If

h = loBound
Do
h = 3 * h + 1
Loop Until h > upBound

Do
h = h / 3
For i = h + 1 To upBound
v = t(i): j = i
Do While t(j - h) > v
t(j) = t(j - h): j = j - h
If j <= h Then
Exit Do
End If
Loop
t(j) = v
Next i
Loop Until h = loBound
End Sub


Ces 2 implémentations, chez moi, trient un tableau de 350.000
éléments (long) en moins d'une seconde.

Je suis prêt à croire que comparer des String soit plus coûteux,
mais ça ne devrait quand même pas être si violent.
Disons 5 minutes, mais pas plus.

Si ça n'allait pas, tu trouveras ici des choses pas mal:
http://www.devx.com/vb2themax/Article/19900

et notamment ceci:
http://www.devx.com/vb2themax/Tip/19472

C'est une implémentation ultra-optimisée de QuickSort. D'après l'auteur,
il trie 500.000 string en 30 secondes (utiliser pQuickSortS )

Si tu fais un benchmark des différentes méthodes, je suis intéressé par
les résultats :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
1 2 3