fs: jak zlokalizować folder nadrzędny?

193

Jak to napisać, aby wrócić do poziomów nadrzędnych 2 i znaleźć plik?

fs.readFile(__dirname + 'foo.bar');
fantazyjny
źródło

Odpowiedzi:

277

Spróbuj tego:

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

Zwróć uwagę na ukośnik na początku względnej ścieżki.

Andrew Hare
źródło
25
Próbowałem tego bez powodzenia, ale właśnie to zrobiłem fs.readFile(__dirname + '/../../foo.bar');i zadziałało.
fantazyjne
6
Zakładam, że to __dirnamebyło coś w stylu '/foo/bar'raczej niż '/foo/bar/'.
Andrew Hare
3
Pierwsze „/” na twojej ścieżce: „/../../foo.bar” ​​jest kluczowe. Miałem „../../foo.bar”, który był przyczyną mojego problemu.
levibostian
1
czemu? po prostu dlaczego? czy ktoś może wyjaśnić?
eyurdakul
@eyurdakul Jeśli dobrze rozumiem corrently: __dirnamemoże wyglądać /path/to/your/dir, jeśli powiesz, że __dirname + ".."to /path/to/your/dir.., co jest katalog nie istnieje, zamiast /path/to/your. Cięcie jest ważne.
joulev
162

Użyj 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() poradzi sobie z początkowymi / końcowymi ukośnikami i po prostu zrobi właściwą rzecz i nie musisz próbować pamiętać, kiedy końcowe ukośniki istnieją, a kiedy nie.

Alex Wayne
źródło
4
ta odpowiedź ze path.joinjest poprawny sposób, zaakceptowanej odpowiedź nie powinna być stosowana, to nawet wyzwala eslinton airbnb-base preset, zasada no-path-concat w szczególności
revelt
100th upvote. Mój __dirnamebył host/src/foldera ja potrzebowałem host/folderi ten pracował dla mnie, a nie odpowiedź OP.
carkod
8
możesz path.join(__dirname, '..', '..', 'foo.bar')
Pan Nikt
Dziękuję Alex, uratowałeś mnie po 6 godzinach poszukiwań,
SHOHIL SETHIA
95

Wiem, że to trochę wybredne, ale wszystkie dotychczasowe odpowiedzi nie są całkiem poprawne.

Celem path.join () jest wyeliminowanie potrzeby, aby program wywołujący wiedział, którego separatora katalogów należy użyć (co czyni platformę kodu agnostyczną).

Technicznie prawidłowa odpowiedź brzmi:

var path = require("path");

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

Dodałbym to jako komentarz do odpowiedzi Alexa Wayne'a, ale jeszcze za mało przedstawicieli!

EDYCJA: zgodnie z obserwacją użytkownika1767586

smremde
źródło
4
„foo.bar” ​​powinno być „foo.bar”. Próbowałem dokonać edycji, ale zmiany muszą mieć minimum 6 znaków (głupia zasada, jeśli mnie pytasz, uniemożliwia nam edycję takich małych literówek).
user1767586,
1
Podejrzewam, że to najlepsza odpowiedź. Niektóre inne odpowiedzi mogą działać dla danej osoby w danym systemie operacyjnym, ale obecność określonego rodzaju separatora hierarchii plików (tj. Ukośnika) w tych innych odpowiedziach sprawia, że ​​zastanawiam się, jak uniwersalne. np. próbuję napisać aplikację Electron w sposób agnostyczny na platformę i chociaż nie wyczerpująco tego udowodniłem, podejrzewam, że jest to najbezpieczniejszy sposób. Dzięki.
Andrew Willems,
Jest to w rzeczywistości niepotrzebne, ponieważ path.join () wewnętrznie używa path.normalize () (który przekształca wszystkie separatory ścieżek do bieżącego / zamierzonego formatu systemu operacyjnego) na wynikowej połączonej ścieżce przed powrotem. Ale to nie może zranić.
iono
55

Najprostszym sposobem byłoby użycie path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
źródło
rzeczywiście poprawne rozwiązanie, ponieważ nie trzeba rozstrzygać folderu, dołączając ../do ścieżki
João Pimentel Ferreira,
@Jak nazywa się „..”?
gaurav
12

Wygląda na to, że będziesz potrzebował pathmodułu. ( path.normalizew szczególności)

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

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));
Dominic Barnes
źródło
11

Jeśli inny moduł dzwoni do Ciebie i nadal chcesz znać lokalizację uruchamianego pliku głównego, możesz użyć modyfikacji kodu @ Jason:

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

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

W ten sposób uzyskasz lokalizację uruchamianego skryptu.

Jeremy Battle
źródło
8

Jeśli nie masz pozytywnego zdania na temat tego, gdzie jest rodzic, dostaniesz ścieżkę;

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

fs.readFile(__parentDir + '/foo.bar');
Jason Brumwell
źródło
5

Możesz użyć

path.join(__dirname, '../..');
puneet
źródło
2

korzystam z aplikacji elektronowej i mogę pobrać folder nadrzędny za pomocą path.resolve ()

poziom rodzica 1:path.resolve(__dirname, '..') + '/'

rodzic 2 poziomy:path.resolve(__dirname, '..', '..') + '/'

ン エ ン ト ゥ ア ン ズ ン
źródło
1

zadziała to również:

fs.readFile(`${__dirname}/../../foo.bar`);
Dhruvin modi
źródło