我需要一种方法来获取正在运行的脚本的路径(包含源文件的目录),但是
(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的机器和操作系统之间进行了这个目录。
答案 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))