2012-01-06 17 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** 

Sto usando sbcl-1.0.54.percorso sconosciuto?

Qualsiasi suggerimento è apprezzato!

risposta

4

Un pathname è una struttura che rappresenta un percorso utilizzando componenti, come unità, ospite, directory, nome, ecc Vedere here per maggiori dettagli.

si costruisce un pathname utilizzando make-pathname funzione con :directory, :name e altre parole chiave, e la funzione restituisce un oggetto di tipo pathname:

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

La funzione merge-pathnames come documentato here, completa i componenti mancanti del nome percorso specificato con quelli da percorso-percorso predefinito:

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

Modifica: non funziona per te perché stai costruendo un percorso con :name e che specifica il nome del file (senza estensione o :type). Quindi quando chiami merge-pathnames non trova un componente mancante nel suo percorso, perché "cgi-bin /" è specificato come :name (il nome file) e hai già un nome di file in "nav.py".

+0

Vedere anche la fine del capitolo di PCL su [File e file I/O] (http://www.gigamonkeys.com/book/files-and-file-io.html). – Daimrod