2009-12-21 13 views
218

Sto eseguendo Ruby su Windows anche se non so se questo dovrebbe fare la differenza. Tutto quello che voglio fare è ottenere il percorso assoluto della directory di lavoro corrente. E 'possibile da irb? A quanto pare da uno script è possibile utilizzando File.expand_path(__FILE__)come ottenere il percorso assoluto della directory di lavoro corrente da irb

Ma da IRB ho provato quanto segue e ottenuto un "Permesso negato" l'errore:

File.new(Dir.new(".").path).expand 
+6

La questione non è in realtà chiaro: Volete a) la directory di lavoro corrente (che è 'Dir.pwd') o volete la directory in cui il momento si trova lo script in esecuzione (che è 'File.dirname (__ FILE __)')? Immagina di chiamare uno script da qualsiasi altra parte (come 'ruby testdirectory/testscript.rb') qui, i due saranno diversi! – amenthes

+1

@amenthes Reclami che la mia domanda non è chiara e poi chiedi "Vuoi a) la directory di lavoro corrente ..." e la mia domanda afferma "Tutto quello che voglio fare è ottenere il percorso assoluto * della directory di lavoro * ... ". Cosa non è chiaro? –

+4

non è chiaro a causa della frase "Apparentemente da uno script è possibile usare' File.expand_path (__ FILE __) '" - perché la posizione di '__FILE__' è un animale diverso dalla directory di lavoro corrente (che è' Dir.pwd'). – amenthes

risposta

160

File.expand_path File.dirname(__FILE__) restituirà la directory relativo al file questo comando viene chiamato da.

Ma Dir.pwd restituisce la directory di lavoro (risultati identici a eseguire pwd nel terminale)

+2

'Dir.pwd' equivale a 'pwd -P'.'exec ('pwd -L')' otterrà l'equivalente di pwd nel terminale (pwd è normalmente un built in bash e non risolve i collegamenti simbolici). –

+1

si prega di dare un'occhiata anche alla classe Pathname spesso dimenticata: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/pathname/rdoc/Pathname.html – awenkhh

+0

C'è un problema, Dir.pwd stampa la directory di lavoro in cui viene eseguito lo script, che potrebbe non essere quello che desideri. – Brandon

4

Questo vi darà la directory di lavoro del file corrente.

File.dirname(__FILE__) 

Esempio:

current_file: "/Users/nemrow/SITM/folder1/folder2/amazon.rb"

risultato: "/ Users/nemrow/SITM/folder1/folder2"

+0

Si noti che la directory di lavoro non deve essere uguale al file attuale. Quindi 'Dir.pwd' e il tuo suggerimento potrebbe essere diverso. – Besi

42

per quanto riguarda il percorso relativo allo script in esecuzione corrente, dal momento che rubino 2.0 è anche possibile utilizzare

__dir__ 

Quindi questo è fondamentalmente lo stesso come

File.dirname(__FILE__) 
+8

Mi chiedo perché l'incoerenza, perché non '__DIR__'? – Zequez

+11

@Zequez Perché ['__FILE__' è una costante ma' __dir__' è un metodo] (http://stackoverflow.com/a/15190725/405017). – Phrogz

+0

questo stamperà la directory di lavoro in cui viene eseguito lo script come @Brandon ha detto. –

1

Se si desidera ottenere il percorso completo della directory del file rb corrente:

File.expand_path('../', __FILE__) 
1

Attraverso questo si può ottenere il percorso assoluto di qualsiasi file situato in qualsiasi directory.

File.join(Dir.pwd,'some-dir','some-file-name') 

Ciò restituirà

=> "/User/abc/xyz/some-dir/some-file-name" 
Problemi correlati