Recherche de sous-répertoires de sous-répertoires... (imbrication)

aston05 Messages postés 4 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 21 juillet 2009 - 21 juil. 2009 à 11:59
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 - 21 juil. 2009 à 14:16
Bonjour,

J'ai un souci au niveau de la fonction Dir que j'utilise pour faire une recherche de sous-répertoire. Si je l'utilise que pour 1 niveau, à priori, il ne semble pas y avoir de problèmes. Par contre si je fais une recherche des sous-répertoires des sous-répertoires dont j'ai défini le chemin au préalable, j'ai une erreur au niveau de l'appel de la fonction au moment de reboucler. Voici grossomodo l'architecture de mon programme relatif à cette partie et les erreurs se situent au niveau de Sub2folder Dir mais je suppose qu'il en sera de même pour Sub1folder Dir et Folder = Dir. Par contre, sans imbrication, la syntaxe semble correcte et j'ai donc du mal à comprendre:

Folder = Dir("C:", vbDirectory)
While Folder <> ""
Sub1Folder = Dir("C:" & Folder & "", vbDirectory)
While Sub1Folder <> ""
Sub2folder = Dir("C:\Dcns\Fremm\IPMS" & Folder & "" & Sub1Folder & "", vbDirectory)
While Sub2folder <> ""
'Traitement spécifique...
Sub2folder = Dir
Wend
Sub1Folder = Dir
Wend
Folder = Dir
Wend

Si qq'un pouvait m'aider sur ce point, ce serait sympa ;-)
Merci d'avance
A voir également:

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 juil. 2009 à 12:04
Salut
Sans l'indentation du code, difficile à lire.

Voir ce message récentpour les explications du pourquoi (3ème réponse).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
aston05 Messages postés 4 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 21 juillet 2009
21 juil. 2009 à 12:04
ERRATUM:

J'avais simplifier le chemin pour synthétiser les choses mais je n'ai pas tout supprimé partout:

Folder = Dir("C:", vbDirectory)
While Folder <> ""
Sub1Folder = Dir("C:" & Folder & "", vbDirectory)
While Sub1Folder <> ""
Sub2folder = Dir("C:" & Folder & "" & Sub1Folder & "", vbDirectory)
While Sub2folder <> ""
'Traitement spécifique...
Sub2folder = Dir
Wend
Sub1Folder = Dir
Wend
Folder = Dir
Wend
0
aston05 Messages postés 4 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 21 juillet 2009
21 juil. 2009 à 12:05
J'avais fait l'indentation mais à l'affichage du message, tout s'est aligné à gauche...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 juil. 2009 à 12:06
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 juil. 2009 à 12:07
Essaye d'utiliser le balisage par langage avec l'icone (3ème à partir de la droite)
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
21 juil. 2009 à 13:12
l'indentation disparait lorsque en mode texte classique mais reste lorsque tu l'encapsule avec les balises de code VB.

En ce qui concerne le code pour voir une arboressence, il faut utiliser une fonction qui s'appelle elle même.

Public Function Traiter_s_repertoires ( Add as string ) 
    Dim fic as string
    fic = Dir(Add & "" & *, vbDirectory)
    
    While (fic <> "")
        'ici faire le traitement
        'fic contient le nom du sous dossier
        
        'demander que le traitement soit fait 
        'pour les sous repertoires du sous repertoire
        Call Traiter_s_repertoires(Add & "" & fic)
        fic = dir
    Wend

End Function


Cordialement
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
21 juil. 2009 à 13:14
toutes les excuses, j'ai fait une faute à la ligne suivante

fic = Dir(Add & "" & *, vbDirectory)


en faite c'est :

fic = Dir(Add & "\*", vbDirectory)


VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
0
aston05 Messages postés 4 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 21 juillet 2009
21 juil. 2009 à 13:54
Ca revient à imbriquer un Dir dans un Dir ça, non? Et est-ce qu'on ne va pas avoir le même problème que ce que j'ai actuellement?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 juil. 2009 à 14:08
Absolument
Les DIR se sont pas imbricables, d'où l'intérêt de la source dont je t'ai passé le lien

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
21 juil. 2009 à 14:16
A, je ne me suis jamais posé la question, mais en effet, Dir doit conserver des paramètres et du coup, passer d'un niveau à un autre serrai caduc... Je ne m'était jamais posé la question ^^

du coup, je pense qu'il faut procéder différement.

la fonction que je te donne regarde les dossiers et les explorent au fur et à mesure.
il faudrait, tjs sur le principe de fonction qui s'appelle elle même, que la liste des sous dossiers soit lue et stokée dans un tableau temporaire. Et une fois la liste lue, on lance la fonction pour chaque sous dossier:


Public Function Traiter_s_repertoires ( Add as string ) 

    Dim fic as string
         fic = Dir(Add & "\*", vbDirectory)
    Dim nb_sd as integer 'nombre de sous dossiers
        nb_sd = 0
    Dim t_sd() as string

    'dresser la liste des sous repertoires
    While (fic <> "")
        nb_sd = nb_sd + 1
        Redim Preserve t_sd(1 to nb_sd)
        t_sd(nb_sd) = fic
        fic = dir
    Wend

    'traiter tous les répertoires
    dim i as integer
    for i = 1 to nb_sd
        'traiter le sous repertoire
        'add : addresse du sous repertoire (sans le nom du sous repertoire)
        't_sd(i) nom du sous repertoire

        'demander que le traitement soit fait 
        'pour les sous repertoires du sous repertoire
        Call Traiter_s_repertoires(Add & "" & fic)
    next

End Function



l'utilisation de fonctions autoapelante peut saturer la pile de l'ordinateur dans certains cas...
utiliser des tableau peut saturer la ram dans certains cas

VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
0
Rejoignez-nous