PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 23 → fListeRépertoire
fListeRépertoire
Débuté par Brandon David, 07 juin 2018 15:26 - 12 réponses
Posté le 07 juin 2018 - 15:26
Bonjour
Est ce que quelqu'un a réussi avec la fonction fListeRépertoire de lister en récursif par exemple uniquement que 4 niveaux de dossiers
Pour 4 niveaux
x= un nombre indéfini
Ex: c:\dossiers(x)\dossiers(x)\dossiers(x)\dossiers(X) et c'est tout même si il y encore plein de sous-dossiers
Je ne vois pas comment faire
Merci par avance
Membre enregistré
55 messages
Posté le 07 juin 2018 - 15:43
Bonjour, je n'ai jamais utilisé cette fonction mais avec un TANTQUE nbTour < x ça ne fonctionnerait pas ?

--
Et bon dev !
Si vous avez des petits projets n'hésitez pas à me faire participer : DrTulipe0@gmail.com
Membre enregistré
79 messages
Posté le 07 juin 2018 - 15:57
Bonjour

Tu peux réinterpréter le fListeRépertoire.

x est un entier = 4
sRépertoire est une chaîne = SysRep(srMesDocuments) + fSep

tabRépertoire est un tableau de chaînes
POUR TOUTE chaîne sLeRépertoire de fListeRépertoire(sRépertoire,frRécursifSEPAREE PARAR RC
sCompare est une chaîne = ChaîneSupprime(sLeRépertoire,sRépertoire,SansCasse)
SI ChaîneOccurrence(sCompare,fSep) <= x ALORS
TableauAjoute(tabRépertoire,sLeRépertoire)
FIN
FIN
Membre enregistré
128 messages
Popularité : +1 (1 vote)
Posté le 07 juin 2018 - 16:02
Bonjour,
Si tu es certain que le chemin ne contient qu'un seul dossier par niveau, tu peux faire un flisterepertoire et ne garder que les 4 premières extractions sur RC

sListeRépertoire = fListeRépertoire(SysRep(srMesDocuments))
nbr est un entier
POUR TOUTE chaîne sRep de sListeRépertoire SEPAREE PAR RC
nbr++
// Traitement du répertoire sRep
// la variable sRep contient le nom du répertoire à traiter
SI nbr<5 ALORS
Trace( sRep) //traitement du repertoire ici par exemple
FIN
FIN


Sinon, tu comptes les \ de chaque résultats et ne garde que ceux qui en ont moins de 5 ....il y a surement plein de méthodes...

bon dev !
Membre enregistré
226 messages
Popularité : +4 (4 votes)
Posté le 07 juin 2018 - 19:08
Bonsoir,

Il faut utiliser la fonction fListeRépertoire() avec une procédure de traitement car là même en "bidouillant" avec un incrément, fListeRépertoire() vous renvoi une chaîne contenant TOUS les sous-répertoires PUIS la boucle traite que les 4 premiers niveaux. Pas très performant votre solution !

nNiveau est un entier
sRepRacine est une chaîne = "C:\MonRepertoire"


fListeRépertoire(sRepRacine, TraiteRepertoire, fCheminUNICODE+frRécursif)

PROCEDURE INTERNE TraiteRepertoire(LOCAL psRep est une chaîne, LOCAL psSousRep est une chaîne)
nNiveau = ChaîneOccurrence(Remplace(psRep + ["\"] + psSousRep, sRepRacine, ""), "\")
SI nNiveau = 5 ALORS RENVOYER Faux

Trace(psRep + ["\"] + psSousRep)

RENVOYER Vrai
FIN
Message modifié, 07 juin 2018 - 19:08
Posté le 08 juin 2018 - 08:28
Merci pour vos réponses
Mais j'avais fait.
En fait dans le programme que je suis entrain de faire le fListeRépertoire me liste tous les dossiers de un ou plusieurs Serveurs d'entreprise.
Comme souvent ces serveurs contiennent plus milliers voir millions de dossiers (tous niveaux confondu).
Le blocage (l'attente ...) du résultat se fait directement sur le résultat de fonction fListeRépertoire. (plusieurs heures d'attente)
Et justement mon idée et ma question était de pouvoir signifier à la fonction de s'arrêter à un certain niveau de sous-dossier.
Je crains fort que la fonction ne soit pas ouverte à ce genre d’aptitude.
Il va falloir probablement que je passe par du .net
A vous lire
Membre enregistré
9 messages
Posté le 08 juin 2018 - 11:44
Brandon David a écrit :
Merci pour vos réponses
Mais j'avais fait.
En fait dans le programme que je suis entrain de faire le fListeRépertoire me liste tous les dossiers de un ou plusieurs Serveurs d'entreprise.
Comme souvent ces serveurs contiennent plus milliers voir millions de dossiers (tous niveaux confondu).
Le blocage (l'attente ...) du résultat se fait directement sur le résultat de fonction fListeRépertoire. (plusieurs heures d'attente)
Et justement mon idée et ma question était de pouvoir signifier à la fonction de s'arrêter à un certain niveau de sous-dossier.
Je crains fort que la fonction ne soit pas ouverte à ce genre d’aptitude.
Il va falloir probablement que je passe par du .net
A vous lire


Bonjour,

Dans la documentation de la fonction, il existe une seconde syntaxe :

Interruption de fListeRépertoire (Syntaxe 2)

Tant qu'il y a des répertoires à parcourir, la fonction fListeRépertoire ne peut pas être interrompue. Pour forcer l'interruption du parcours, utilisez la ligne suivante dans la procédure  :
RENVOYER Faux
Dans ce cas, la fonction fListeRépertoire retourne le nombre de répertoires parcourus jusqu'à l'appel de "Renvoyer Faux".
Dans les autres cas (pour poursuivre le parcours), la procédure  DOIT renvoyer Vrai.
Si la procédure  retourne aucune valeur (ni Vrai, ni Faux), une erreur est générée.


Je n'ai pas testé mais cela devrait pouvoir vous aider avec une variable gérant le niveau.

Cordialement
Membre enregistré
226 messages
Popularité : +4 (4 votes)
Posté le 08 juin 2018 - 23:08
Bonsoir,

Le code que j’ai posté fait totalement le job mais bon...
Membre enregistré
9 messages
Posté le 11 juin 2018 - 08:43
Damien a écrit :
Bonsoir,

Le code que j’ai posté fait totalement le job mais bon...


Bonjour,

Tout à fait Damien et excusez moi, je n'avais que survolé votre code et pas fait attention que vous aviez justement utilisé cette seconde syntaxe et une variable gérant le niveau.

Cordialement
Posté le 12 juin 2018 - 07:55
Merci Damien pour le code effectivement cela marche nickel bien je n'y avais pas pensé Bon dev
Membre enregistré
72 messages
Posté le 12 juin 2018 - 11:22
Bonjour;

Pour parcourir tous les sous répertoires jusqu'au niveau 4 de chacun
En utilisant toujours le code proposé par Damien

nNiveau est un entier
sRepRacine est une chaîne = "C:\WinDev 20"

fListeRépertoire(sRepRacine, TraiteRepertoire, fCheminUNICODE+frRécursif)

PROCEDURE INTERNE TraiteRepertoire(LOCAL psRep est une chaîne, LOCAL psSousRep est une chaîne)
nNiveau = ChaîneOccurrence(Remplace(psRep + ["\"] + psSousRep, sRepRacine, ""), "\")
SI nNiveau < 5 ALORS
Trace(psRep + ["\"] + psSousRep)
FIN
FIN


Bon Dev.
Message modifié, 12 juin 2018 - 11:25
Membre enregistré
226 messages
Popularité : +4 (4 votes)
Posté le 12 juin 2018 - 14:01
Ton code n’est pas bon Fouedsua, car tu n’a aucun RENVOYER dans la procédure interne. Et donc, il va effectivement écrire dans la trace les repertoires viulues mais aussi continuer le parcours des répertoires suivant... Perte de performances et inutile dans le cas voulu.

Il faut un RENVOYER Vrai pour continuer le parcours et un RENVOYER Faux pour le stopper.
Membre enregistré
72 messages
Posté le 13 juin 2018 - 01:02
Bonsoir;
@Damien

Oui effectivement, et c'est ce qui est mentionné :
Pour parcourir tous les sous répertoires jusqu'au niveau 4 de chacun


et je pense que ça répond à la demande; c'est ce que j'ai compris en tout les cas.
sinon s'il faut s’arrêter au 1er niveau 4 du 1er sous répertoire. ton code répond à la demande parfaitement.

Bon Dev.
Message modifié, 13 juin 2018 - 01:03