2013-05-30 29 views
6

私は、実行中のスクリプト(ソースファイルを含むディレクトリ)のパスを取得する方法が必要ですが、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スティックでアプリを運ぶので、ラケットがインストールされたマシンとオペレーティングシステムの間でそれを運ぶように、独自のディレクトリを見つけることができる必要があります。

答えて

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'定義は' path-only'を使わずに正確に行います。 –

+0

'(パスのみ(path->完全パス(システムパスの検索 'ランファイル)))'はDrRacketで実行されても動作しません。代わりにDrRacketへのパスを返します。 –

1

あなたは絶対パスをしたい場合は、その後、私は、これはそれを行うべきだと思う:

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

これは確実に動作しません。 '' run-file'を使うと、モジュールがスクリプトとして実行されている場合、 'find-system-path'は' racket 'と' 'で実行するときに実行可能な' racket'へのパスを返します。 –

関連する問題