2013-05-30 5 views
6

Ho bisogno di un modo per ottenere il percorso dello script in esecuzione (la directory che contiene il file di origine), maRacket: come recuperare il percorso del file in esecuzione?

(current-directory) 

mai punti lì (in questo caso un disco esterno), ma piuttosto in una certa posizione predefinita .

Ho creato un file per provare tutti i "find-system-path", ma nessuno di questi è il file in esecuzione! I documenti Racket non aiutano.

#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)) 

Lo scopo è per un'applicazione web-server locale (server musicale) che modificherà sottodirectory sotto la directory che contiene il file di origine. Porterò l'app su una chiavetta USB, quindi deve essere in grado di localizzare la propria directory mentre la porto tra macchine e sistemi operativi con Racket installato.

risposta

10

Modo semplice: prendere il nome dello script in esecuzione, farne un percorso completo, quindi prendere la sua directory:

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

Ma è molto più probabile interessati non nel file che è stato utilizzato per eseguire le cose (il server web), ma nel vero file sorgente in cui stai inserendo il tuo codice. Vale a dire, vuoi che alcune risorse siano vicine alla tua fonte. Un vecchio modo di fare questo è:

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

Un modo migliore per farlo è quello di utilizzare `runtime-path', che è un modo per definire tali risorse:

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

questo è meglio sine registra anche il percorso come qualcosa da cui dipende il tuo script, quindi se dovessi impacchettare il tuo codice come programma di installazione, ad esempio, Racket saprebbe di comprimere anche quel file png.

E, infine, è possibile utilizzarlo per puntare a un intera directory:

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

@SquareCrow: Re la tua modifica suggerita - non è necessaria, la definizione "QUI" che ho citato alla fine fa esattamente questo, senza usare "solo percorso". –

+0

'(percorso-path (percorso-> percorso-completo (find-system-path 'run-file))))' non funziona quando è in esecuzione su DrRacket. Invece restituisce il percorso di DrRacket. –

1

Se si desidera che il percorso assoluto, allora penso che questo dovrebbe farlo:

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

Questo non funziona in modo affidabile. Con ''run-file',' find-system-path' restituisce il percorso all'eseguibile 'racket' quando si esegue con' racket ' e '' se il modulo viene eseguito come script. –