Aller au contenu

Petit soucis sur l'existence d'un fichier.


Messages recommandés

Posté(e)

Bonjour à la communauté.
Aujourd'hui, je cherche à contrôler si un fichier existe, avant de l'ouvrir.
Mon fichier dessin est : D:\Plans Maisons\Maison_S00N01G2C4_001.dwg
Je cherche donc à vérifier si ce même fichier, avec une autre extension, existe D:\Plans Maisons\Maison_S00N01G2C4_001.Niv.
N'ayant rien trouvé sur le web (mal cherché probablement), je me suis rabattu sur l'aide en ligne d'AutoCAD et j'ai écris ça :

(defun c:IfFileExist ()
  (princ "\nTest sur l'existance d'un fichier.")
  (setq	DWGCourant (vla-get-activedocument (vlax-get-acad-object))
	NomComp	   (vla-get-FullName DWGCourant)
	NomDwg	   (vl-filename-base NomComp)
	RepDwg	   (vl-filename-directory NomComp)
	ExtDwg	   (vl-filename-extension NomComp)
  ) ;_ Fin de setq
  (princ (strcat "\nNomComp : " NomComp))
  (princ (strcat "\nNomDwg : " NomDwg))
  (princ (strcat "\nRepDwg : " RepDwg))
  (princ (strcat "\nExtDwg : " ExtDwg))
  (princ "\n*******")
  (setq NouvExt (strcat RepDwg "\\" NomDwg ".Niv"))
  (princ (strcat "\nNouvExt : " NouvExt))
  (if (/= (findfile NouvExt) "")
    (princ "\nFichier trouvé")
    (princ "\nFichier pas trouvé")
  )
  (princ)
)

Je me bat avec ce Lisp depuis des heures qui me dit systématiquement que le fichier (.Niv) existe, que ce soit vrai ou non...
Voici une copie de ma fenêtre Texte :

Test sur l'existance d'un fichier.
NomComp : D:\Plans Maisons\Maison_S00N01G2C4_001.dwg
NomDwg : Maison_S00N01G2C4_001
RepDwg : D:\Plans Maisons
ExtDwg : .dwg
*******
NouvExt : D:\Plans Maisons\Maison_S00N01G2C4_001.Niv
Fichier trouvé
Commande:

Si quelqu'un pouvait a une astuce, un conseil... je suis preneur.
 

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)

Posté(e)

Désolé la communauté.
C'est le FindFile que j'avais mal écris.
Voici le bon code, s'il peut servir à quelqu'un :

;;; *************************************
(defun c:IfFileExist ()
  (princ "\nTest sur l'existance d'un fichier.")
  (setq	DWGCourant (vla-get-activedocument (vlax-get-acad-object))
	NomComp	   (vla-get-FullName DWGCourant)
	NomDwg	   (vl-filename-base NomComp)
	RepDwg	   (vl-filename-directory NomComp)
	ExtDwg	   (vl-filename-extension NomComp)
  ) ;_ Fin de setq
  (princ (strcat "\nNomComp : " NomComp))
  (princ (strcat "\nNomDwg : " NomDwg))
  (princ (strcat "\nRepDwg : " RepDwg))
  (princ (strcat "\nExtDwg : " ExtDwg))
  (princ "\n*******")
  (setq NouvExt (strcat RepDwg "\\" NomDwg ".Niv"))
  (princ (strcat "\nNouvExt : " NouvExt))
  (if (/= (findfile NouvExt) nil)
    (princ "\nFichier trouvé")
    (princ "\nFichier pas trouvé")
  )
  (princ)
)

Encore toutes mes excuses de t'avoir dérangé.
Denis...

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)

Posté(e)

Coucou @DenisHen,

Juste à titre d'information purement logique, plutôt que d'écrire

(if (/= [...] nil)
  ... ; If not nil, then
  ... ; If nil, then
)

On va simplement écrire

(if [...]
  ... ; If not nil, then
  ... ; If nil, then
)

parce que le premier argument du (if), correspondant à la condition, permet de tester si une expression est VRAI ou FAUX, ce qui en langage LISP se traduit par T ou NIL.
Donc dans ton cas de figure

  (if (/= (findfile NouvExt) nil)
    (princ "\nFichier trouvé")
    (princ "\nFichier pas trouvé")
  )

devient

  (if (findfile NouvExt)
    (princ "\nFichier trouvé")
    (princ "\nFichier pas trouvé")
  )

ce qui, aussi bien à l'écriture qu'à la lecture, simplifie un peu la vie et t'épargne quelques redondances et lapalissades de programmation 😜
PS: Je me permet de faire la remarque car ce n'est pas la première fois que je vois tes conditions de (if) écrient ainsi... Après peut-être est-ce volontaire pour simplifier ta compréhension personnelle lors de la relecture ^^

Bisous,
Luna

Posté(e)

Coucou @Luna.
Merci à toi pour cette remarque très judicieuse. Effectivement, je me suis compliqué la vie, le code et certainement une relecture ultérieure moins efficace... C'est curieux, je ne fais jamais cette "erreur" en VBA et toujours en Lisp 🤔.
Ton observation coule de source et est la bienvenue.
J'ai partagé ce code sans tenir compte que d'autres pourraient avoir un peu de mal à le comprendre.
Donc, pour les plus néophytes que moi, il doit il y en avoir un ou deux, voici le code plus simple à comprendre :

;;; *************************************
(defun c:IfFileExist ( / DWGCourant NomComp NomDwg RepDwg ExtDwg NouvExt)
  (princ "\nTest sur l'existance d'un fichier.")
  (setq	DWGCourant (vla-get-activedocument (vlax-get-acad-object))
	NomComp	   (vla-get-FullName DWGCourant)
	NomDwg	   (vl-filename-base NomComp)
	RepDwg	   (vl-filename-directory NomComp)
	ExtDwg	   (vl-filename-extension NomComp)
  ) ;_ Fin de setq
  (princ (strcat "\nNomComp : " NomComp))
  (princ (strcat "\nNomDwg : " NomDwg))
  (princ (strcat "\nRepDwg : " RepDwg))
  (princ (strcat "\nExtDwg : " ExtDwg))
  (princ "\n*******")
  (setq NouvExt (strcat RepDwg "\\" NomDwg ".Niv"))
  (princ (strcat "\nNouvExt : " NouvExt))
  (if (findfile NouvExt)
    (princ "\nFichier trouvé")
    (princ "\nFichier pas trouvé")
  )
  (princ)
)
;;; *************************************

Et ne pas oublier de déclarer les variables...
Encore merci à toi Luna.
Bisous.
Denis...

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)

Posté(e)

Bonjour.

Je ne suis pas convaincu de l'utilité de définir une fonction (avec "c:" qui plus est)
Nativement (findile) renvoie nil si le fichier n'est pas trouvé, donc tester le chemin dans le programme principal me semble suffisant.

À moins qu'il s'agisse d'autre chose, et que je ne l'ai pas appréhendé.

Amicalement

 

Posté(e)

Bonjour @didier.
Je suis entièrement d'accord avec toi. J'ai fais ce petit code indépendant et temporaire pour comprendre les fonctions vl-filename.
Je ne comptais pas l'utiliser plus tard.
Et je l'ai partagé pour que d'autres membres puissent faire, eux aussi, leurs petits tests d'apprentissage.
Bien à toi l'ami 😉

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)

Posté(e)

Il n'y a pas de soucis, on est tous débutants, quelque soit nos compétences 😉

Et chacun réfléchis à sa manière donc ce qui peut être logique pour certains peut ne pas l'être pour d'autres. Après en effet comme le dit @didier, la fonction native (findfile) permet déjà de vérifier l'existence d'un fichier. Attention cependant car d'après l'aide il est normal que la fonction (findfile) te renvoie le fichier ".niv" comme existant :

The findfile function makes no assumption about the file type or extension of filename. If filename does not specify a drive/directory prefix, findfile searches the AutoCAD library path. If a drive/directory prefix is supplied, findfile looks only in that directory.

Bref, quand tu as un doute, toujours vérifier l'aide AutoCAD c'est déjà une vraie mine d'or.

Bisous, Luna

  • 2 semaines après...
Posté(e)

Salut @Luna et merci pour ton aide.
Je regarde toujours (maintenant) dans l'aide en ligne et ailleurs sur la toile, mais c'est parfois difficile de trouver la bonne réponse.
Denis...

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)

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é