2012-01-06 19 views
5
* (make-pathname :name "cgi-bin/") 
#P"cgi-bin/" 
* (merge-pathnames "nav.py" #P"cgi-bin/") 
#P"cgi-bin/nav.py" ; **it is ok** 
* (merge-pathnames "nav.py" (make-pathname :name "cgi-bin/")) 
#P"nav.py"   ; why ? 

*(defvar bp #P"/media/E/myapp/cgi-bin/") 
* bp 
#P"/media/E/myapp/cgi-bin/") 
* (merge-pathnames "nav.py" bp) 
#P"nav.py"   ; why ? 
* (merge-pathnames "nav.py" #P"/media/E/myapp/cgi-bin/") 
#P"/media/E/myapp/cgi-bin/nav.py" ; **it is ok** 

Estoy usando sbcl-1.0.54.nombre de ruta extraño?

¡Cualquier sugerencia es apreciada!

Respuesta

4

Un pathname es una estructura que representa una ruta usando componentes, como unidad , anfitrión, directorio, nombre , etc. Ver here para más detalles.

se construye un pathname usando make-pathname función con :directory, :name y otras palabras clave, y la función devuelve un objeto de tipo pathname:

CL-USER> (defvar p (make-pathname :directory '(:absolute "home" "test" "docs"))) 
CL-USER> #P"/home/test/docs/" 

La función merge-pathnames como se documenta here, completa los componentes que faltan del nombre de ruta especificado con los de nombre de ruta predeterminado:

CL-USER> (merge-pathnames p "tada.txt") 
CL-USER> #P"/home/test/docs/tada.txt" 

Editar: no funciona para usted porque está construyendo una ruta de acceso con :name y especifica el nombre del archivo (sin extensión o :type). Por lo tanto, cuando llama al merge-pathnames, no encuentra un componente faltante en su ruta de acceso, porque "cgi-bin /" se especifica como :name (el nombre del archivo), y usted ya tiene un nombre de archivo en "nav.py".

+0

Consulte también el final del capítulo de PCL sobre [Archivos y archivos de E/S] (http://www.gigamonkeys.com/book/files-and-file-io.html). – Daimrod

Cuestiones relacionadas