2011-08-16 2 views

risposta

153

Prova questo:

fs.readFile(__dirname + '/../../foo.bar'); 

Nota la barra all'inizio del percorso relativo.

+22

avevo cercato che senza fortuna, ma ho solo ha fatto 'fs.readFile (__ dirname + '/../../ foo.bar');' e ha funzionato. – fancy

+6

Suppongo quindi che '__dirname' somigli a' '/ foo/bar'' piuttosto che a'/foo/bar/''. –

+1

suppongo di sì ... – fancy

8

Sembra che sia necessario il modulo path. (path.normalize in particolare)

var path = require("path"), 
    fs = require("fs"); 

fs.readFile(path.normalize(__dirname + "/../../foo.bar")); 
105

Usa path.join http://nodejs.org/docs/v0.4.10/api/path.html#path.join

var path = require("path"), 
    fs = require("fs"); 

fs.readFile(path.join(__dirname, '../..', 'foo.bar')); 

path.join() gestirà leader/finali barre per voi e solo fare la cosa giusta e non si deve cercare di ricordare quando esistono barre finali e quando non lo fanno.

+0

questa risposta con 'path.join' è il modo corretto, la risposta accettata non deve essere seguita, si attiva anche' eslint' su 'airbnb-base preset', la regola [no-path-concat] (https: // eslint.org/docs/rules/no-path-concat) in particolare – revelt

+0

100a upvote.Il mio '__dirname' era' host/src/folder' e avevo bisogno di 'host/folder' e questo ha funzionato per me, non la risposta OP. – carkod

6

Se non sei positivo su dove si trova il genitore, questo ti porterà sul percorso;

var path = require('path'), 
    __parentDir = path.dirname(module.parent.filename); 

fs.readFile(__parentDir + '/foo.bar'); 
6

Se un altro modulo chiama il vostro e che ci si piace ancora di conoscere la posizione del file principale in esecuzione è possibile utilizzare una modifica del Codice di Jason @:

var path = require('path'), 
    __parentDir = path.dirname(process.mainModule.filename); 

fs.readFile(__parentDir + '/foo.bar'); 

In questo modo sarete ottenere la posizione dello script effettivamente in esecuzione.

52

So che è un po 'schizzinoso, ma tutte le risposte finora non sono corrette.

Il punto di path.join() è di eliminare la necessità per il chiamante di sapere quale separatore di directory utilizzare (rendendo agnostico la piattaforma del codice).

Tecnicamente la risposta corretta sarebbe qualcosa di simile:

var path = require("path"); 

fs.readFile(path.join(__dirname, '..', '..', 'foo.bar')); 

avrei aggiunto questo come un commento alla risposta di Alex Wayne, ma non abbastanza rep ancora!

EDIT: come per l'osservazione di user1767586

+3

"foo.bar" dovrebbe essere "foo.bar". Ho provato a fare una modifica, ma le modifiche devono essere di almeno 6 caratteri (regola stupida se me lo chiedi, ci impedisce di modificare piccoli refusi come questo) – user1767586

4

È possibile utilizzare

path.join(__dirname, '../..'); 
34

Il modo più semplice sarebbe quella di utilizzare path.resolve:

path.resolve(__dirname, '..', '..'); 
+0

effettivamente il corretto soluzione in quanto non è necessario risolvere la cartella unendo '../' al percorso –