Bred Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Salut,Pour répondre à ce message, je voulait en premier lieu créer une routine de recherche de fichier....et bien sûr, vu que j'ai un arbre de répertoire, je me suis dit dans ma petite tête que le mieux serait d'utiliser une fonction récursive... :casstet: J'en ai fait une, elle fonctionne :D (j'en suis le premier éttonné).... presque !!! :mad: (ah... là, ça devient plus normal pour moi...)... le résultat est aléatoire, et je ne comprends pas pourquoi !!!! La commande de lancement : (defun c:chem-fich () (setq test-chem-fichier nil rep-Orig (getstring "\n Disque à Parcourir :") rep-Orig (strcat rep-Orig ":") nom-fichier (getstring "\n Nom du Fichier (avec ext) :")) (setq test-chem-fichier (findfile (strcat rep-Orig "\\" nom-fichier))) (setq list-rep-orig (vl-remove "." (vl-remove ".." (vl-directory-files (strcat rep-Orig "\\") nil -1)))) (setq rep (strcat rep-Orig "\\" (car list-rep-orig))) (while (>= (length list-rep-orig) 1) (setq fichier (cherche-fichier rep nom-fichier)) (if (> (length list-rep-orig) 1) (progn (setq list-rep-orig (vl-remove (car list-rep-orig) list-rep-orig) rep (strcat rep-Orig "\\" (car list-rep-orig)))) (setq list-rep-orig nil) ) ) (princ (strcat "\n Chemin Fichier : " fichier)) (princ) ) La routine récursive : (defun cherche-fichier (rep nom-fichier) (setq list-rep (vl-remove "." (vl-remove ".." (vl-directory-files (strcat rep "\\") nil -1)))) (While (and list-rep (not test-chem-fichier)) (setq test-chem-fichier (findfile (strcat rep "\\" nom-fichier))) (if (and (not test-chem-fichier) list-rep) (foreach n list-rep (if (not (equal (findfile (strcat rep "\\" n "\\" nom-fichier)) nil)) (setq test-chem-fichier (strcat rep "\\" n "\\" nom-fichier)))) ) (if (and (not test-chem-fichier) list-rep) (cherche-fichier (strcat rep "\\" (car list-rep)) nom-fichier) ) (if (and (not test-chem-fichier) (> (length list-rep) 1)) (setq list-rep (vl-remove (car list-rep) list-rep) rep (strcat rep "\\" (car list-rep))) (setq list-rep nil) ) ) test-chem-fichier ) J'était tellement content que ça marche.... dommage, là, je plante.... merci d'avance.... [Edité le 26/1/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 26 janvier 2007 Auteur Posté(e) le 26 janvier 2007 Ah... je viens de mettre le doigt sur ma bétise : je ne traite que le Sous premier répertoire et ses sous répertoires de mon groupe de répertoire !... donc, si le fichier n'est pas dedans, ça plante.... Je vais peut-être trouvé..... [Edité le 26/1/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 SalutTu as regardé le lisp Scriptor ?Il te recherche tous les fichiers ainsi que tous les sous répertoires à partir d'une branche de l'arborescence @+ ps : dedans, tu as une fonction récursive Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Un truc que j'avais fait à une époque (je croyais l'avoir posté, mais pas retrouvé) (defun extract_folder (lst_fold / l_dir l) (setq l_dir '()) (foreach n lst_fold (setq l (vl-directory-files n nil -1)) (if (eq (car l) ".") (setq l (cddr l)) ) (cond (l (setq l_dir (append (mapcar '(lambda (x) (strcat n x "/") ) l ) l_dir ) ) ) ) ) l_dir ) (defun c:where_file ( / disk_unit folder_name file2find folder_list) (setq disk_unit (getstring T "\nUnité de disque? : ") folder_name (strcat disk_unit (vl-string-translate "\\" "/" (getstring T "\nDémarrer du dossier? : "))) file2find (getstring "\nFichier à trouver? : ") folder_list (list folder_name) ) (textscr) (if (vl-directory-files folder_name file2find 1) (princ (strcat "\nFichier " file2find " trouvé dans le dossier " (strcase (vl-string-translate "/" "\\" folder_name)))) ) (while (setq folder_list (extract_folder folder_list)) (foreach n folder_list (if (vl-directory-files n file2find 1) (princ (strcat "\nFichier " file2find " trouvé dans le dossier " (strcase (vl-string-translate "/" "\\" n)))) ) ) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 début de parenthèse Moralité : Ca sert à rien de mettre des pseudos dans le titre du sujet :mad: Je dis ça à Cordona aussi ! fin de parenthèse s'cusez Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 26 janvier 2007 Auteur Posté(e) le 26 janvier 2007 Ca sert à rien de mettre des pseudos dans le titre du sujetEn effet... sauf que c'est pour un problème de récursivité, et comme (gile) est un champion (que je soupsonne passionné par la chose) je lui ai adressé par principe. Merci en tout cas de vos réponses. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Je suis assez d'accord avec Tramber concernant les pseudos. J'apprécie beaucoup le côté "celui qui passe par là répond s'il peut le faire" ; d'autant que le vrai champion de la récursivité sur ce site, je dirais que c'est ElpanovEvgeniy, même si sa discrétion (due à des difficultés avec la langue française sûrement) ne lui a permis de nous montrer ses talents ici. Je n'ai pas eu le temps de me pencher sur la question mais d'autres y ont brillament répondu ;) Si j'ai le temps (et le courrage), j'essaierais de faire un truc récursif, juste pour le fun. Je ne suis pas vraiment "passionné" mais sûrement assez fasciné par ce procédé. [Edité le 26/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ElpanovEvgeniy Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Je suis assez d'accord avec Tramber concernant les pseudos. J'apprécie beaucoup le côté "celui qui passe par là répond s'il peut le faire" ; d'autant que le vrai champion de la récursivité sur ce site, je dirais que c'est ElpanovEvgeniy, même si sa discrétion (due à des difficultés avec la langue française sûrement) ne lui a permis de nous montrer ses talents ici. Je n'ai pas eu le temps de me pencher sur la question mais d'autres y ont brillament répondu ;) Si j'ai le temps (et le courrage), j'essaierais de faire un truc récursif, juste pour le fun. Je ne suis pas vraiment "passionné" mais sûrement assez fasciné par ce procédé. [Edité le 26/1/2007 par (gile)] Je regrette beaucoup. Je ne connais pas du tout le Franзais la langue, mais j'en utilisant le compilateur non je comprends exactement les questions... PS. Je ne me passionne pas récursivité, je les utilise а l'йgal de n'importe quels autres programmes, je compile seulement а part (sans optimalisation). Evgeniy
ElpanovEvgeniy Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Chez vous le trиs bon site!Je suis content que je peux le lire :)On regrette, mais je ne vous peux pas aider....Moi seulement le lecteur. :( Evgeniy
Bred Posté(e) le 26 janvier 2007 Auteur Posté(e) le 26 janvier 2007 J'apprécie beaucoup le côté "celui qui passe par là répond s'il peut le faire"OK, je suis désolé, mais ce n'était vraiment pas dans mon idée lorque j'ai écris ce message.En fait au début je voulais le mettre en réponse au message explicatif sur la récursivité que nous à offert (gile).Puis pour éviter de polluer ce dernier je me suis dit qu'il valait mieux répondre dans un message à part. Mon Titre reprenant le pseudo (gile) n'avait pour but que de lui rendre une sorte d''hommage via son message pré-cité, comme je l'ai fait (en me trompant me semble t'il) pour Tramber, en le sitant dans une de mes réponse pour une macro-bouton. Donc, j'édite mon message afin de retirer son pseudo, et je lui demande de m'excuser car autant j'aprécie tout le travail qu'il nous offre, autant j'aprécie la manière dont il le fait.(et il y en a d'autre.) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Tramber Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 T'inquiètes pas, c'est pas un reproche, en fait, ca m'a juste fait repenser à un message précédent où il y avait mon propre pseudo en sujet de message. Ca m'a surtout paru incongru quand ca m'a concerné. Je me suis dit d'emblée que je me serais senti mal à l'aise de ne pas répondre. Et quid de si je n'avais pas été là ? (apprécierz la syntaxe et le mot latin, je ne suis pas si sûr d'avoir écrit une phrase correcte) D'autant que c'était tout comme ; ca n'est pas moi qui ait répondu avec la bonne solution. En revanche, citer un(e) autre dans les messages et les réponses est un plaisir. Certains nomment tous leurs fichiers avec leur prénom, font de bons mots et se cachent dérrière des animaux préhistoriques, s'ils m'appelaient au secours et que je puisse les aider, j'acourrrrerais protégé de mon casque pour les secourir. Mais ils sont trop forts, ils ont connu la version 12 ! :cool: (hahaha) Amitiés à tous, dinosaures et neo-sapiens ! [Edité le 26/1/2007 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Bred, tu n'as pas besoin de t'excuser, je ne suis ni faché, ni vexé, ni même froissé, juste touché par "l'hommage" que tu me rends. ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 26 janvier 2007 Auteur Posté(e) le 26 janvier 2007 Tu as regardé le lisp Scriptor ?Il te recherche tous les fichiers ainsi que tous les sous répertoires à partir d'une branche de l'arborescenceJe viens de le faire, mais j'avoue ne pas encore être assez compétant pour pouvoir en ressortir les choses qui doivent m'intérrésser....mais ressort-t'il les sous-répertoire des sous-répertoire ? Bonuscad :merci encore pour ta routine, mais elle ne répond pas à mon problème (j'ai l'impression après quelque tests) : elle ne ressort pas les sous-répertoire des sous-répertoire. (d'où ma question à Patrick_35).... et c'est aussi le problème que je rencontre.... Je cherche à scruter TOUT le disque.... merci. [Edité le 26/1/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 26 janvier 2007 Posté(e) le 26 janvier 2007 Oui, et c'est là (defun GetFolders ( path / _GetFolders _Collector _Main ) (defun _GetFolders ( path / folders ) (if (vl-position "." (setq folders (vl-directory-files path nil -1))) (cddr folders) folders ) ) (defun _Collector ( folder / temp ) (cons (setq temp (strcat path "\\" folder)) (apply 'append (_Main temp))) ) (defun _Main ( path ) (mapcar '_Collector (_GetFolders path)) ) (apply 'append (_Main path)) ) ps : c'est du repiqué sur TheSwamp ;) et difficile de faire plus court 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 27 janvier 2007 Posté(e) le 27 janvier 2007 Je serais bien incapable de proposer quelque chose après le code posté par Patrick_35. C'est super concis, admirablement écrit et c'est un très bel exemple de "récurcivité mutuelle" :la fonction _Main appelle la fonction _Collector qui appelle la fonction _Main ... Je pense qu'il serait difficile de faire aussi concis sans utiliser la récursivité. [Edité le 27/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 Voilà, j'ai adapté le code donné par Patrick_35 pour rechercher un fichier. Les arguments sont le nom du fichier ("toto.dwg" par exemple) et le chemin ("C:" ou "C:\\Mes Dessins\\Dessins de Toto") La recherche s'arrêtre dès que le fichier est trouvé.Il est évident que plus le chemin est précis, moins la recherche sera longue. Exemple : (getfile "acad.exe" "C:") retourne "C:\\Program Files\\AutoCAD 2007\\acad.exe" (defun GetFile (file path / _GetFolders _Collector _Main rslt) (defun _GetFolders (path / folders) (if (vl-position "." (setq folders (vl-directory-files path nil -1)) ) (cddr folders) folders ) ) (defun _Collector (folder / temp) (if (findfile (strcat path "\\" file)) (setq rslt (list (strcat path "\\" file))) (cons (setq temp (strcat path "\\" folder)) (apply 'append (_Main temp)) ) ) ) (defun _Main (path) (if (null rslt) (mapcar '_Collector (_GetFolders path)) ) ) (apply 'append (_Main path)) (car rslt) ) [Edité le 27/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ElpanovEvgeniy Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 Merci (gile)! Vous avez aidй а comprendre la question... :) (defun GetFile (f p) (cond ((vl-directory-files p f) (mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f)) ) ((apply (function append) (mapcar (function (lambda (x) (GetFile f (strcat p "\\" x)))) (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1))) ) ;_ mapcar ) ;_ apply ) (t nil) ) ;_ cond ) ;_ defun Le contrфle (getfile "acad.exe" "C:") ; =>> '("C:\\Program Files\\AutoCAD 2004\\acad.exe") (getfile "acad*.lsp" "C:\\Program Files") ; =>> '("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp" "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp" "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp" "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp" ) Evgeniy
ElpanovEvgeniy Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 (defun GetFile (f p) (if (vl-directory-files p f) (mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f)) (apply (function append) (mapcar (function (lambda (x) (GetFile f (strcat p "\\" x)))) (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1))) ) ) ) ) Evgeniy
ElpanovEvgeniy Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 Oops...Dans le programme l'erreur, je suis corrigй. (defun GetFile (f p) (apply (function append) (cons (if (vl-directory-files p f) (mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f)) ) ;_ if (mapcar (function (lambda (x) (GetFile f (strcat p "\\" x)))) (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1))) ) ;_ mapcar ) ;_ cons ) ;_ apply ) Evgeniy
(gile) Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 Super Evgeniy :D :D :D Je suis content que tu puisses nous montrer tes talents, merci. Dans la "bidouille" que je donnais plus haut, la recherche s'arrête au premier fichier trouvé, l'exécution de la routine est donc d'autant plus rapide que le dossier se trouve "en tête de liste". Les routines données par Evgeniy continuent la recherche dans tous les dossiers et sous dossiers et peuvent donc retrouver tous le fichiers "acad*.lsp" par exemple. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 27 janvier 2007 Auteur Posté(e) le 27 janvier 2007 Merci à vous.... :D je pense qu'il serait bien de mettre ces différentes routines (exeptionnel) dans la Section "Routine LISP".Je laisse l'un de vous le faire !... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 Je pense que l'on est en train d'atteindre des sommets dans l'art du lisp :D Merci à ElpanovEvgeniy pour sa démonstration @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 27 janvier 2007 Posté(e) le 27 janvier 2007 C'est Nickel ! Is perfect! Bonne démonstration de maitrise de récursivité.Merci Evgeniy :) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
ElpanovEvgeniy Posté(e) le 28 janvier 2007 Posté(e) le 28 janvier 2007 Super Evgeniy :D :D :D Je suis content que tu puisses nous montrer tes talents, merci. Dans la "bidouille" que je donnais plus haut, la recherche s'arrête au premier fichier trouvé, l'exécution de la routine est donc d'autant plus rapide que le dossier se trouve "en tête de liste". Les routines données par Evgeniy continuent la recherche dans tous les dossiers et sous dossiers et peuvent donc retrouver tous le fichiers "acad*.lsp" par exemple. Cette version cherche seulement le premier fichier... (defun GetFirstFile (f p) (cond ((not p) nil) ((vl-directory-files (car p) f)(strcat (car p) "\\"(car (vl-directory-files (car p) f)))) ((GetFirstFile f (append (mapcar (function (lambda (x) (strcat (car p) "\\" x))) (vl-remove ".." (vl-remove "." (vl-directory-files (car p) nil -1))) ) ;_ mapcar (cdr p) ) ;_ append ) ;_ GetFirstFile ) ) ;_ cond ) ;_ defun Test: (GetFirstFile "acad.exe" '("C:")) =>> "C:\\Program Files\\AutoCAD 2004\\acad.exe" Evgeniy
(gile) Posté(e) le 28 janvier 2007 Posté(e) le 28 janvier 2007 Juste pour le fun et pour me faire mentir (et par la même faire mentir Patrick_35), une autre version de GetFolders plus concise, mais plus classique et moins élégante (simple récursivité) (defun GetFolders (path / l c) (if (setq l (vl-directory-files path nil -1)) (apply 'append (mapcar '(lambda (x) (cons (setq c (strcat path "\\" x)) (GetFolders c)) ) (vl-remove "." (vl-remove ".." l)) ) ) ) ) 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