Racket:如何检索正在运行的文件的路径?

时间:2013-05-30 17:50:31

标签: path racket

我需要一种方法来获取正在运行的脚本的路径(包含源文件的目录),但是

(current-directory) 

永远不会指向那里(在这种情况下是外部驱动器),而是指向某个预定位置。

我创建了一个文件来尝试所有'find-system-path',但它们都不是正在运行的文件! Racket文档没有帮助。

#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的机器和操作系统之间进行了这个目录。

2 个答案:

答案 0 :(得分:10)

简单方法:获取正在运行的脚本名称,使其成为完整路径,然后获取其目录:

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

但是你更有可能不会对用于执行事物的文件(Web服务器)感兴趣,而是在你将代码放入的实际源文件中。即,你想要一些资源关闭到你的来源。更老的方法是:

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

更好的方法是使用`runtime-path',这是一种定义此类资源的方法:

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

这是更好的正弦,它还将路径注册为脚本所依赖的内容 - 因此,如果您要将代码打包为安装程序,例如,Racket也会知道打包该png文件。

最后,您可以使用它指向整个目录:

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

答案 1 :(得分:1)

如果你想要绝对路径,那么我认为应该这样做:

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