Aller au contenu

Messages recommandés

Posté(e)

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...

Posté(e)

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...

Posté(e)

Salut

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'arborescence

 

@+

 

ps : dedans, tu as une fonction récursive

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)
Ca sert à rien de mettre des pseudos dans le titre du sujet

En 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...

Posté(e)

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

Posté(e)
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

Posté(e)
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...

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)
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'arborescence

Je 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...

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)
 (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

Posté(e)

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

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)
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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité