fs: comment localiser un dossier parent?


Réponses:


279

Essaye ça:

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

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


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.


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


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


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"));

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.


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');

5

Vous pouvez utiliser

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

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, '..', '..') + '/'


1

cela fonctionnera également:

fs.readFile(`${__dirname}/../../foo.bar`);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.