fs: Wie finde ich einen übergeordneten Ordner?

193

Wie schreibe ich das, um die übergeordneten 2 Ebenen wieder aufzusuchen und eine Datei zu finden?

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

Antworten:

277

Versuche dies:

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

Beachten Sie den Schrägstrich am Anfang des relativen Pfads.

Andrew Hare
quelle
25
Ich hatte das ohne Glück versucht, aber ich tat fs.readFile(__dirname + '/../../foo.bar');es einfach und es funktionierte.
Lust auf den
6
Ich __dirnamegehe dann davon aus, dass das '/foo/bar'eher so war als '/foo/bar/'.
Andrew Hare
3
Das allererste '/' auf Ihrem Weg: '/../../foo.bar' ist entscheidend. Ich hatte '../../foo.bar', was mein Problem verursachte.
Levibostian
1
Warum? nur allgemein warum? kann mir bitte jemand erklären
Eyurdakul
@eyurdakul Wenn ich es corrently verstehen: __dirnameaussehen kann /path/to/your/dir, wenn Sie sagen , __dirname + ".."es ist /path/to/your/dir.., was ein nicht vorhandenes Verzeichnis ist, statt /path/to/your. Der Schrägstrich ist wichtig.
JouleV ist bei topanswers.xyz
161

Verwenden Sie 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() übernimmt führende / nachfolgende Schrägstriche für Sie und tut einfach das Richtige, und Sie müssen sich nicht daran erinnern, wann nachfolgende Schrägstriche vorhanden sind und wann nicht.

Alex Wayne
quelle
4
diese Antwort mit path.joinist der richtige Weg, die akzeptierte Antwort sollte nicht gefolgt werden, es selbst löst eslintauf airbnb-base preset, die Regel nicht-Weg-concat insbesondere
revelt
100. Gegenstimme. Mein __dirnamewar host/src/folderund ich brauchte host/folderund das funktionierte für mich, nicht die OP-Antwort.
Carkod
8
Sie können noch einen Schritt weiter gehen und tunpath.join(__dirname, '..', '..', 'foo.bar')
Mr. Nobody
Danke Alex, du hast mich nach 6 Stunden Suche gerettet,
SHOHIL SETHIA
95

Ich weiß, dass es ein bisschen wählerisch ist, aber alle Antworten sind bisher nicht ganz richtig.

Der Punkt von path.join () besteht darin, dass der Aufrufer nicht mehr wissen muss, welches Verzeichnistrennzeichen verwendet werden soll (wodurch die Codeplattform agnostisch wird).

Technisch gesehen wäre die richtige Antwort so etwas wie:

var path = require("path");

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

Ich hätte dies als Kommentar zu Alex Waynes Antwort hinzugefügt, aber noch nicht genug Wiederholungen!

BEARBEITEN: gemäß der Beobachtung von user1767586

smremde
quelle
4
'foo.bar "sollte' foo.bar 'sein. Ich habe versucht, eine Bearbeitung vorzunehmen, aber die Änderungen müssen mindestens 6 Zeichen lang sein (dumme Regel, wenn Sie mich fragen, verhindert, dass wir kleine Tippfehler wie diese bearbeiten).
user1767586
1
Ich vermute, dass dies die beste Antwort ist. Einige der anderen Antworten funktionieren möglicherweise für eine bestimmte Person unter einem bestimmten Betriebssystem, aber das Vorhandensein einer bestimmten Art von Dateihierarchie-Trennzeichen (dh des Schrägstrichs) in diesen anderen Antworten lässt mich fragen, wie universell sie sind. Ich versuche beispielsweise, eine Electron-App plattformunabhängig zu schreiben, und obwohl ich dies nicht vollständig bewiesen habe, vermute ich, dass dies der sicherste Weg ist. Vielen Dank.
Andrew Willems
Dies ist eigentlich nicht erforderlich, da path.join () intern path.normalize () (das alle Pfadtrennzeichen in das aktuelle / beabsichtigte Betriebssystemformat umwandelt) für den resultierenden verbundenen Pfad verwendet, bevor es zurückkehrt. Es kann aber nicht schaden.
Iono
55

Der einfachste Weg wäre zu verwenden path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
quelle
in der Tat die richtige Lösung, da Sie den Ordner nicht auflösen müssen, indem Sie sich ../dem Pfad anschließen
João Pimentel Ferreira
@Yan wie heißt '..'?
Gaurav
12

Sieht so aus, als ob Sie das pathModul benötigen . ( path.normalizeinsbesondere)

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

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

Wenn ein anderes Modul Ihr Modul aufruft und Sie dennoch den Speicherort der ausgeführten Hauptdatei wissen möchten, können Sie eine Änderung des Codes von @ Jason verwenden:

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

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

Auf diese Weise erhalten Sie den Speicherort des Skripts, das tatsächlich ausgeführt wird.

Jeremy Battle
quelle
8

Wenn Sie nicht sicher sind, wo sich die Eltern befinden, erhalten Sie den richtigen Weg.

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

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

Sie können verwenden

path.join(__dirname, '../..');
Puneet
quelle
2

Ich verwende eine Elektronen-App und kann den übergeordneten Ordner über path.resolve () abrufen.

Elternteil 1 Stufe:path.resolve(__dirname, '..') + '/'

Eltern 2 Ebenen:path.resolve(__dirname, '..', '..') + '/'

グ エ ン ト ゥ ゥ ン ン ズ
quelle
1

das wird auch funktionieren:

fs.readFile(`${__dirname}/../../foo.bar`);
Dhruvin modi
quelle