2010-09-17 11 views

Respuesta

2

Creo que hay varias maneras. probe-file seguido de verificar el verdadero nombre devuelto para determinar que tiene un nombre de directorio pero no un nombre de archivo y el tipo debería hacerlo. p.ej. para un directorio

(pathname-name (probe-file filespec)) 

-> NIL 
+0

Al intentar su solución, tuve que darme cuenta de que este código generará un error en caso de que no haya ningún archivo o directorio 'filespec'. Sugiero usar un 'y' para menos código propenso a errores:' (y (probe-file especificación de archivos) (no (pathname-name (probe-file filespec)))) ' – Sim

+1

Eso no funcionará. No está claro si 'PROBE-FILE' funciona en directorios. Tampoco está claro que 'pathname-name' devuelva' NIL' para directorios. En general, Common Lisp no proporciona realmente esta funcionalidad y la mayoría de las implementaciones tienen una función para eso. Las bibliotecas proporcionan nombres portátiles ... –

0

CLISP tiene una función EXT:PROBE-DIRECTORY, que le indica si un archivo existe y es un directorio.

Tenga en cuenta que esta función es específica de CLISP y no de la lista común estándar.

+0

Lo siento pero es GNU Common Lisp y GNU CLISP lo mismo? Estoy usando GNU Common Lisp (GCL 2.6.6 en Windows) pero no pude encontrar dicho paquete "ext". –

+0

@hyper: No, GCL y CLISP son dos implementaciones diferentes del lenguaje Common Lisp. Desde que etiquetó este 'clisp' asumí que estaba usando el último. – sepp2k

+0

Se ha eliminado la etiqueta clisp. ¡Gracias! –

1

CL-FADDIRECTORY-EXISTS-P tiene una función que, cuando se utiliza en combinación con PATHNAME-AS-DIRECTORY canonicalizes el nombre de ruta (evita el fallo cuando se entregó una cadena como "/ ruta/dir-sin-trailing-slash") y achives lo que estás pidiendo.

(CL-FAD: directorio-PATHNAME-P (CL-FAD: PATHNAME-AS-DIRECTORIO (SONDA-FILE "/ ruta/faltante-slash")))

+0

Parece que esto no funcionará con GCL. Al menos GCL no aparece en la lista de "Implementaciones de Lisp compatibles" – sepp2k

+0

Supongo que la buena noticia es que, como GCL no ha tenido un lanzamiento en más de media década, si descubres cómo hacerlo allí probablemente no tengas que ¡Preocúpate de que te cambie pronto! – Ken

+0

Comprobé el código fuente de CL-FAD, dicha función solo funciona para Allegro y LispWorks. –

4

Leer el capítulo sobre un portable pathname library de El libro de Peter Seibel Practical Common Lisp. Está disponible de forma gratuita. Tiene una función file-exists-p que devolverá un nombre de ruta cuando el archivo exista o nulo si no lo hace. El nombre de ruta devuelto estará en forma de directorio si es un directorio. También le da otra función para verificar si la ruta de acceso está realmente en forma de directorio.

Por cierto, vale la pena leer todo el libro, así que échale un vistazo si aún no lo has hecho.

+2

La biblioteca CL-FAD * es * el capítulo de Peter Seibel, empaquetado para uso general. La función DIRECTORY-EXISTS-P hace exactamente lo que describes. – Ken

+0

No lo sabía. Gracias por la info. – jondro

Cuestiones relacionadas