fs: come posso individuare una cartella principale?


195

Come faccio a scrivere questo per tornare al livello 2 padre per trovare un file?

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

Risposte:


279

Prova questo:

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

Nota la barra in avanti all'inizio del percorso relativo.


25
Ci avevo provato senza fortuna ma l'ho fatto fs.readFile(__dirname + '/../../foo.bar');e ha funzionato.
fantasia

6
Presumo quindi che __dirnamefosse qualcosa di simile '/foo/bar'piuttosto che di '/foo/bar/'.
Andrew Hare,

3
Il primo '/' nel tuo percorso: '/../../foo.bar' è cruciale. Ho avuto '../../foo.bar' che stava causando il mio problema.
levibostiano,

1
perché? solo in genere perché? qualcuno può spiegare per favore?
eyurdakul,

@eyurdakul Se ho ben capito corrently: __dirnamepuò sembrare /path/to/your/dir, se si dice __dirname + ".."che è /path/to/your/dir.., che è una directory inesistente, piuttosto che /path/to/your. La barra è importante.
joulev

165

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à le barre iniziali / finali per te e farà semplicemente la cosa giusta e non dovrai cercare di ricordare quando esistono barre finali e quando non lo fanno.


4
questa risposta con path.joinè il modo corretto, la risposta accettata non dovrebbe essere seguita, si innesca anche eslintsu airbnb-base preset, la regola di non-path-concat in particolare
revelt

100 ° voto. La mia __dirnameera host/src/foldere avevo bisogno host/foldere questo ha funzionato per me, non è la risposta OP.
Carkod,

8
puoi fare un ulteriore passo avanti e farepath.join(__dirname, '..', '..', 'foo.bar')
Mr. Nobody il

Grazie Alex, mi hai salvato dopo 6 ore di ricerche,
SHOHIL SETHIA

95

So che è un po 'esigente, ma tutte le risposte finora non sono del tutto giuste.

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

Tecnicamente la risposta corretta sarebbe qualcosa del tipo:

var path = require("path");

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

Lo avrei aggiunto come commento alla risposta di Alex Wayne ma non ancora abbastanza rappresentante!

EDIT: come da osservazione dell'utente1767586


4
'foo.bar "dovrebbe essere' foo.bar '. Ho provato a fare una modifica ma le modifiche devono avere un minimo di 6 caratteri (stupida regola se me lo chiedi, ci impedisce di modificare piccoli errori di battitura come questo).
user1767586

1
Sospetto che questa sia la risposta migliore. Alcune delle altre risposte potrebbero funzionare per un determinato individuo su un determinato sistema operativo, ma la presenza di un tipo specifico di separatore della gerarchia dei file (ovvero la barra) in quelle altre risposte mi fa domandare quanto siano universali. ad esempio, sto cercando di scrivere un'app Electron in modo agnostico sulla piattaforma e, anche se non l'ho provato in modo esaustivo, sospetto che questo sia il modo più sicuro. Grazie.
Andrew Willems,

Questo in realtà non è necessario, poiché path.join () utilizza internamente path.normalize () (che trasforma tutti i separatori di percorso nel formato di sistema operativo attuale / previsto) sul percorso unito risultante prima di tornare. Non può far male, però.
iono,


12

Sembra che avrai bisogno del pathmodulo. ( path.normalizein particolare)

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

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

11

Se un altro modulo chiama il tuo e desideri comunque conoscere la posizione del file principale in esecuzione, puoi utilizzare una modifica del codice @ Jason:

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

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

In questo modo otterrai la posizione dello script effettivamente in esecuzione.


8

Se non sei sicuro di dove sia il genitore, questo ti porterà sul percorso;

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

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


2

sto eseguendo l'app di elettroni e posso ottenere la cartella principale da path.resolve ()

livello padre 1:path.resolve(__dirname, '..') + '/'

livelli padre 2:path.resolve(__dirname, '..', '..') + '/'


1

questo funzionerà anche:

fs.readFile(`${__dirname}/../../foo.bar`);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.