fs: jak zlokalizować folder nadrzędny?


Odpowiedzi:


277

Spróbuj tego:

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

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


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.


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


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


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

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.


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


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.