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

Tôi đang sử dụng sbcl-1.0.54.tên đường dẫn lạ?

Bất kỳ đề xuất nào được đánh giá cao!

Trả lời

4

Một pathname là một cấu trúc đại diện cho một tên đường dẫn sử dụng các thành phần, như , chủ, thư mục, tên, vv Xem here để biết thêm chi tiết.

Bạn xây dựng một pathname sử dụng make-pathname chức năng với :directory, :name và các từ khóa khác, và hàm trả về một đối tượng kiểu pathname:

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

Chức năng merge-pathnames như tài liệu here, hoàn thành các thành phần thiếu của tên đường dẫn được chỉ định bằng tên đường dẫn từ tên đường dẫn mặc định:

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

Chỉnh sửa: nó không hoạt động cho bạn bởi vì bạn đang xây dựng một tên đường dẫn với :name và chỉ định tên của tệp (không có phần mở rộng hoặc :type). Vì vậy, khi bạn gọi merge-pathnames, nó không tìm thấy thành phần bị thiếu trong tên đường dẫn của nó, vì "cgi-bin /" được chỉ định là :name (tên tệp) và bạn đã có tên tệp trong "nav.py".

+0

Xem phần cuối chương PCL trên [Tệp và tệp I/O] (http://www.gigamonkeys.com/book/files-and-file-io.html). – Daimrod

Các vấn đề liên quan