(gile) Posté(e) le 31 mai 2018 Posté(e) le 31 mai 2018 Salut, Pour faire suite à ce sujet qui fait suite à celui-là, je propose un challenge (assez) facile pour aborder la récursivité dans un cadre où elle est incontournable. Il s'agit simplement de définir une fonction qui retourne la liste des chemins de tous les dossiers et sous dossiers contenus dans un dossier (voir la fonction vl-directory-files).Choisir un dossier avec des sous-dossiers à différents niveaux d'imbrication. Avec cette arborescence : http://gilecad.azurewebsites.net/Resources/arborescence.pngLa fonction doit retourner cette liste : ( "C:\\Temp\\dossier racine\\Dossier 1" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2" "C:\\Temp\\dossier racine\\Dossier 2" "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1" "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2" ) Merci à ceux qui l'ont déjà fait (ou qui savent le faire) de laisser chercher les autres. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 31 mai 2018 Posté(e) le 31 mai 2018 Salut (gile). La récursivité est encore de la science fiction pour moi... Même ta version "facile" du challenge de Patrick_35, ;) Le niveau est trop haut... Dommage... :( Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Patrick_35 Posté(e) le 31 mai 2018 Posté(e) le 31 mai 2018 La récursivité est encore de la science fiction pour moi... Même ta version "facile" du challenge de Patrick_35, ;) Le niveau est trop haut... Dommage... :(C'est justement le but du challenge. Se triturer les méninges. Allez Denis, allez Denis, allez.... Allez Denis, allez Denis, allez.... @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 31 mai 2018 Posté(e) le 31 mai 2018 Yop Merci à ceux qui l'ont déjà fait (ou qui savent le faire) de laisser chercher les autres. Je vais donc m’abstenir sur celui la,(déja fait) surtout que je me remet sur l'autre, déjà résolu, mais je m'y colle n'ayant pas regarder les résultats même si il est tard et que Simone va gueuler. https://github.com/Fraiddd
vincentp010 Posté(e) le 1 juin 2018 Posté(e) le 1 juin 2018 J'ai un peu de mal avec le récursif, il faut beaucoup réfléchir <_< .Pour le moment je n'arrive que à afficher les dernier répertoires( "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2" "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1" "C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2" ) et pas ceux là( "C:\\Temp\\dossier racine\\Dossier 1" "C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1" "C:\\Temp\\dossier racine\\Dossier 2" ) Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
x_all Posté(e) le 1 juin 2018 Posté(e) le 1 juin 2018 encore une journée chaude dans le sud... pas le temps d'y renter vraiment... je le garde pour le wiki... quelques trucs sur autocad
DenisHen Posté(e) le 1 juin 2018 Posté(e) le 1 juin 2018 Salut.Allez Denis, allez Denis, allez....Merci pour tes encouragements... ;) Mais je n'arrive même pas à le "proser", alors en faire du code... :( Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
Patrick_35 Posté(e) le 3 juin 2018 Posté(e) le 3 juin 2018 Salut J'ai attendu avant de poster ma solution. Je sens que l"on peut faire mieux, mais en attendant...(defun rch_che(rep / che lst) (defun che(rep) (setq lst (cons rep lst)) (mapcar '(lambda(x) (che (strcat rep "\\" x)) ) (cddr (vl-directory-files rep "*.*" -1)) ) ) (che rep) (reverse lst) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 3 juin 2018 Auteur Posté(e) le 3 juin 2018 Salut, C'est malin l'utilisation d'une fonction auxiliaire à effet de bord (maitrisé), même si certains peuvent y voir une entorse à la pureté fonctionnelle (personnellement, j'emploie souvent ce procédé en C#). Juste pour souligner ça, le mapcar, n'est pas nécessaire puisque la liste qu'il retourne n'est jamais utilisée et pourrait être remplacé par un foreach. (defun rch_che(rep / che lst) (defun che (rep) (setq lst (cons rep lst)) (foreach x (cddr (vl-directory-files rep "*.*" -1)) (che (strcat rep "\\" x)) ) ) (che rep) (reverse lst) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 3 juin 2018 Auteur Posté(e) le 3 juin 2018 Je m'aperçois que ce challenge n'est pas si facile, alors je propose, dans un premier temps, de chercher à retourner une liste de sous-liste qui reflète l'arborescence. Exemple de résultat avec l'arborescence décrite plus haut :("C:\\Temp\\dossier racine" ("C:\\Temp\\dossier racine\\Dossier 1" ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1" ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Bidule") ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc" ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.1\\Truc\\Machin") ) ) ("C:\\Temp\\dossier racine\\Dossier 1\\Sous dossier 1.2") ) ("C:\\Temp\\dossier racine\\Dossier 2" ("C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.1") ("C:\\Temp\\dossier racine\\Dossier 2\\Sous dossier 2.2") ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Salut Je suis d'accord, le mapcar n'est pas nécessaire, mais il n'est pas si innocent ;) ps : j'attends demain pour proposer ma solution. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Bonjour, Du coup je met la mienne (defun c:all-dir (/ alldir dir listdir) (setq dir (getstring "\nSaisir le dossier Racine:")) (defun alldir (dir) (setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir))) (append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (vl-directory-files dir nil -1)) (apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,..")) (alldir (strcat dir "\\" x)))) (vl-directory-files dir nil -1) );Fin mapcar );Fin apply );Fin append );Fin alldir (setq listdir (alldir dir)) );Fin all-dir https://github.com/Fraiddd
Patrick_35 Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Salut Tu as les répertoires "." et ".." qui apparaissent dans la liste.Pour éviter de les trouver, tu peux utiliser la fonction cdr + cdr = cddr pour le retour de la fonction vl-directory-files. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Je pensais les avoir fait sautés avec (wcmatch x ".,.."), mais effectivement ils se sont rajouté à la fin des chemins. En fait la difficultés du challenge, c'est le point dans le nom des dossiers, qui fait qu'on ne peut pas utiliser le filtre "*.*" ... je regarde ta soluce tout à l'heure, merci https://github.com/Fraiddd
(gile) Posté(e) le 4 juin 2018 Auteur Posté(e) le 4 juin 2018 Salut Tu as les répertoires "." et ".." qui apparaissent dans la liste.Pour éviter de les trouver, tu peux utiliser la fonction cdr + cdr = cddr pour le retour de la fonction vl-directory-files. @+ Attention, cddr ne marche pas si la racine est un lecteur ("C:" par exemple). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Attention, cddr ne marche pas si la racine est un lecteur ("C:" par exemple).Exact, comme avec le strcat @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 bon, je n'ai pas réussi à faire un filtre correct dans la boucle récursive.du coup je traite la liste finale. (defun c:all-dir (/ alldir dir listdir) (setq dir (getstring "\nSaisir le dossier Racine:")) (defun alldir (dir) (setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir))) (append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (vl-directory-files dir nil -1)) (apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,..")) (alldir (strcat dir "\\" x)))) (vl-directory-files dir nil -1) );Fin mapcar );Fin apply );Fin append );Fin alldir (setq listdir (remove-doubles (mapcar '(lambda ( x ) (vl-string-right-trim "\\..,\\." x)) (alldir dir)))) );Fin all-dir (defun remove-doubles (lst) (if lst (cons (car lst) (remove-doubles (vl-remove (car lst) lst))) ) ) https://github.com/Fraiddd
Patrick_35 Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 bon, je n'ai pas reussi à faire un filtre coorect dans la boucle récursive.Une piste, une racine a toujours 3 caractères. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 une racine a toujours 3 caractères heu, la tu m'embrouille :blink: https://github.com/Fraiddd
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Il me semble que de traiter le lecteur seul, est une exception hors challenge, puisque qu'il est question de dossiers. Mais c'est vrais que mon code n'est pas concis, et est une adaptation d'un code que j'utilise pour lister des fichiers, et pas des dossiers. Je remercie en passant Lee Mac, mon autre mentor. https://github.com/Fraiddd
(gile) Posté(e) le 4 juin 2018 Auteur Posté(e) le 4 juin 2018 @Fraid,Tu n'es vraiment pas loin, regarde comment Patrick_35 utilise (cddr ...) pour écarter les dossiers "." et "..". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 Yop Effectivement, j'avais essayer, mais j'avais du faire une fausse manip, cela fonctionne à la perfection. (defun c:all-dir (/ alldir dir listdir) (setq dir (getstring "\nSaisir le dossier Racine:")) (defun alldir (dir) (setq dir (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir))) (append (mapcar '(lambda ( x ) (strcat dir "\\" x)) (cddr(vl-directory-files dir nil -1))) (apply 'append (mapcar '(lambda ( x )(if (not (wcmatch x ".,..")) (alldir (strcat dir "\\" x)))) (cddr(vl-directory-files dir nil -1)) );Fin mapcar );Fin apply );Fin append );Fin alldir (setq listdir (alldir dir)) );Fin all-dir https://github.com/Fraiddd
(gile) Posté(e) le 4 juin 2018 Auteur Posté(e) le 4 juin 2018 Bravo ! Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 4 juin 2018 Posté(e) le 4 juin 2018 du coup le test(if (not (wcmatch x ".,..")) ne sert à rien.et je comprend toujours pas pourquoi "*.,*.." ne fonctionnais pas.Aurais tu une explication? https://github.com/Fraiddd
(gile) Posté(e) le 4 juin 2018 Auteur Posté(e) le 4 juin 2018 C'est parce que tu faisais :(append (mapcar '(lambda (x) (strcat dir "\\" x)) (vl-directory-files dir nil -1)) ...) avant de filtrer les dossiers ".,..". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant