7

実行中のスクリプトのパス (ソース ファイルを含むディレクトリ) を取得する方法が必要ですが、

(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 がインストールされたマシンとオペレーティング システムの間でアプリを運ぶときに、独自のディレクトリを見つけることができる必要があります。

4

2 に答える 2

12

簡単な方法: 実行中のスクリプト名を取得し、それを完全なパスにしてから、そのディレクトリを取得します。

(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") ...
于 2013-05-30T18:41:50.470 に答える
0

絶対パスが必要な場合は、次のようにする必要があります。

(build-path (find-system-path 'orig-dir)
            (find-system-path 'run-file))
于 2013-05-30T18:42:37.960 に答える