fs: comment localiser un dossier parent?

195

Comment écrire ceci pour remonter les 2 niveaux parent pour trouver un fichier?

fs.readFile(__dirname + 'foo.bar');
fantaisie
la source

Réponses:

279

Essaye ça:

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

Notez la barre oblique au début du chemin relatif.

Andrew Hare
la source
25
J'avais essayé cela sans succès, mais je l'ai fait fs.readFile(__dirname + '/../../foo.bar');et cela a fonctionné.
fantaisie
6
Je suppose alors que __dirnamec'était '/foo/bar'quelque chose comme plutôt que '/foo/bar/'.
Andrew Hare
3
Le tout premier «/» de votre chemin: «/../../foo.bar» est crucial. J'avais «../../foo.bar» qui causait mon problème.
levibostian
1
Pourquoi? juste généralement pourquoi? quelqu'un peut-il expliquer s'il vous plaît?
eyurdakul
@eyurdakul Si je comprends corrently: __dirnamepeut ressembler /path/to/your/dir, si vous dites __dirname + ".."qu'il est /path/to/your/dir.., ce qui est un répertoire inexistant, plutôt que /path/to/your. La barre oblique est importante.
joulev le
165

Utilisez 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() gérera les barres obliques de début / de fin pour vous et fera ce qu'il faut et vous n'aurez pas à essayer de vous souvenir quand les barres obliques de fin existent et quand elles n'existent pas.

Alex Wayne
la source
4
cette réponse avec path.joinla manière correcte, la réponse acceptée ne doit pas être suivi, il déclenche même eslintsur airbnb-base preset, la règle no-chemin concat en particulier
Revelt
100e vote positif. Mon __dirnameétait host/src/folderet je avais besoin host/folderet cela a fonctionné pour moi, pas la réponse OP.
carkod
8
vous pouvez aller plus loin et fairepath.join(__dirname, '..', '..', 'foo.bar')
Mr. Nobody
Merci Alex, tu m'as sauvé après 6 heures de recherche,
SHOHIL SETHIA
95

Je sais que c'est un peu difficile, mais toutes les réponses jusqu'à présent ne sont pas tout à fait exactes.

Le but de path.join () est d'éliminer le besoin pour l'appelant de savoir quel séparateur de répertoire utiliser (rendant la plate-forme de code indépendante).

Techniquement, la bonne réponse serait quelque chose comme:

var path = require("path");

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

J'aurais ajouté ceci en commentaire à la réponse d'Alex Wayne mais pas encore assez de rep!

EDIT: selon l'observation de user1767586

smremde
la source
4
'foo.bar "devrait être' foo.bar '. J'ai essayé de faire une modification mais les modifications doivent être de 6 caractères minimum (règle stupide si vous me demandez, nous empêche d'éditer de petites fautes de frappe comme celle-ci).
user1767586
1
Je soupçonne que c'est la meilleure réponse. Certaines des autres réponses peuvent fonctionner pour un individu donné sur un système d'exploitation donné, mais la présence d'un type spécifique de séparateur de hiérarchie de fichiers (c'est-à-dire la barre oblique) dans ces autres réponses me fait me demander à quel point elles sont universelles. Par exemple, j'essaie d'écrire une application Electron d'une manière indépendante de la plate-forme et, bien que je ne l'ai pas prouvé de manière exhaustive, je soupçonne que c'est le moyen le plus sûr. Merci.
Andrew Willems
Ceci est en fait inutile, car path.join () utilise en interne path.normalize () (qui transforme tous les séparateurs de chemin au format actuel / prévu du système d'exploitation) sur le chemin joint résultant avant de retourner. Cela ne peut pas faire de mal, cependant.
iono
55

Le moyen le plus simple serait d'utiliser path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
la source
en effet la bonne solution car vous n'avez pas besoin de résoudre le dossier en rejoignant ../le chemin
João Pimentel Ferreira
@Yan comment s'appelle «..»?
gaurav le
12

Il semblerait que vous ayez besoin du pathmodule. ( path.normalizeen particulier)

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

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));
Dominic Barnes
la source
11

Si un autre module appelle le vôtre et que vous souhaitez toujours connaître l'emplacement du fichier principal en cours d'exécution, vous pouvez utiliser une modification du code de @ Jason:

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

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

De cette façon, vous obtiendrez l'emplacement du script en cours d'exécution.

Bataille de Jeremy
la source
8

Si vous n'êtes pas sûr de l'endroit où se trouve le parent, cela vous donnera le chemin;

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

fs.readFile(__parentDir + '/foo.bar');
Jason Brumwell
la source
5

Vous pouvez utiliser

path.join(__dirname, '../..');
puneet
la source
2

J'exécute l'application electron et je peux obtenir le dossier parent par path.resolve ()

niveau parent 1:path.resolve(__dirname, '..') + '/'

parent 2 niveaux:path.resolve(__dirname, '..', '..') + '/'

グ エ ン ト ゥ ア ン ズ ン
la source
1

cela fonctionnera également:

fs.readFile(`${__dirname}/../../foo.bar`);
Modi Dhruvin
la source