2013-05-30 33 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 '和''运行时。 –

相关问题