2013-05-30 30 views
6

我需要一種方式來獲得運行腳本(包含源文件的目錄)的路徑,但球拍:如何檢索正在運行的文件的路徑?

(current-directory) 

從來沒有指出存在(在這種情況下,外部驅動器),而是一些預定義位置。

我創建了一個文件來嘗試所有的'find-system-path',但沒有一個是正在運行的文件!球拍文件沒有幫助。

#lang web-server/insta 
(define (start request) 
    (local [{define (build-ul items) 
     `(ul ,@(map itemize items))} 
     {define (itemize item) 
     `(li ,(some-system-path->string (find-system-path item)))}] 
(response/xexpr 
`(html 
    (head (title "Directories")) 
    (body (h1 ,"Some Paths") 
     (p ,(build-ul special-paths))))))) 

(define special-paths (list 'home-dir 
         'pref-dir 
         'pref-file 
         'temp-dir 
         'init-dir 
         'init-file 
         ;'links-file ; not available for Linux 
         'addon-dir 
         'doc-dir 
         'desk-dir 
         'sys-dir 
         'exec-file 
         'run-file 
         'collects-dir 
         'orig-dir)) 

的目的是爲了本地Web服務器應用程序(音樂服務器),將修改包含源文件的目錄下的子目錄。我將把這個應用程序放在一個USB存儲棒上,所以它需要能夠找到它自己的目錄,因爲我在機器和安裝有Racket的操作系統之間進行傳輸。

回答

10

簡單的方法:在運行的腳本的名稱,使之成爲一個完整的路徑,然後取它的目錄:

(path-only (path->complete-path (find-system-path 'run-file))) 

但你更可能感興趣的不是這是用來執行的東西在文件中( Web服務器),但是在實際的源代碼文件中,您要將代碼放入代碼中,也就是說,您需要一些資源接近您的源代碼。這樣做的一箇舊的方法是:

(require mzlib/etc) 
(this-expression-source-directory) 

這樣做的更好的方法是使用'運行時路徑」,這是一種方式來定義這些資源:

(require racket/runtime-path) 
(define-runtime-path my-picture "pic.png") 

這是更好的正弦它還將路徑註冊爲腳本所依賴的路徑 - 因此,如果要將代碼打包爲安裝程序,例如,Racket會知道將該png文件打包。

最後,你可以用它在整個目錄指向:

(define-runtime-path HERE ".") 
... (build-path HERE "pic.png") ... 
+0

@SquareCrow:回覆你的建議編輯 - 這是不需要的,我最後提到的「HERE」定義完全沒有使用「僅路徑」。 –

+0

'(在path-only(path-> complete-path(find-system-path'run-file)))'在DrRacket上運行時不起作用。它將路徑返回到DrRacket。 –

1

如果你想的絕對路徑,那麼我覺得這個應該這樣做:

(build-path (find-system-path 'orig-dir) 
      (find-system-path 'run-file)) 
+1

這不能可靠地工作。使用''run-file'',如果模塊以腳本運行,則'find-system-path'返回到'racket'可執行文件的路徑,當使用'raket '和''運行時。 –

相關問題