fs: как мне найти родительскую папку?

200

Как мне написать это, чтобы вернуться на два родительских уровня в поисках файла?

fs.readFile(__dirname + 'foo.bar');
фантазия
источник

Ответы:

294

Попробуй это:

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

Обратите внимание на косую черту в начале относительного пути.

Эндрю Хэйр
источник
26
Я безуспешно пытался это сделать, но я просто сделал, fs.readFile(__dirname + '/../../foo.bar');и это сработало.
модный
6
Тогда я предполагаю, что это __dirnameбыло что-то вроде '/foo/bar'того '/foo/bar/'.
Эндрю Хэйр
3
Самый первый символ '/' на вашем пути: '/../../foo.bar' имеет решающее значение. У меня был "../../foo.bar", который вызывал мою проблему.
levibostian 03
1
Зачем? просто вообще зачем? может кто-нибудь объяснить?
эюрдакул
@eyurdakul Если я понимаю corrently: __dirnameможет выглядеть /path/to/your/dir, если вы говорите , __dirname + ".."что это /path/to/your/dir.., что это несуществующая директория, а не /path/to/your. Косая черта важна.
joulev
176

Используйте 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() будет обрабатывать начальные / конечные косые черты за вас и просто делать правильные вещи, и вам не нужно пытаться запоминать, когда конечные косые черты существуют, а когда нет.

Алекс Уэйн
источник
4
этот ответ с path.joinправильным путем, принятый ответ не последуют, она даже вызывает eslintна airbnb-base preset, правило не траектория-CONCAT в частности
revelt
100-й голос за. Мой __dirnameбыл host/src/folderи мне нужен, host/folderи это сработало для меня, а не ответ OP.
carkod
8
вы можете сделать еще один шаг и сделатьpath.join(__dirname, '..', '..', 'foo.bar')
Мистер Никто
Спасибо, Алекс, ты спас меня после 6 часов поисков,
ШОХИЛ СЕТИА
95

Я знаю, что это немного придирчиво, но пока все ответы не совсем правильные.

Задача path.join () состоит в том, чтобы избавить вызывающего абонента от необходимости знать, какой разделитель каталогов использовать (делая код независимым от платформы).

Технически правильный ответ будет примерно таким:

var path = require("path");

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

Я бы добавил это как комментарий к ответу Алекса Уэйна, но пока недостаточно репутации!

РЕДАКТИРОВАТЬ: согласно наблюдению пользователя 1767586

Smremde
источник
4
'foo.bar' должен быть 'foo.bar'. Я попытался внести правки, но редактирование должно быть минимум 6 символов (глупое правило, если вы спросите меня, не позволяет нам редактировать небольшие опечатки, подобные этой).
user1767586
1
Подозреваю, что это лучший ответ. Некоторые из других ответов могут работать для данного человека в данной операционной системе, но наличие определенного типа разделителя иерархии файлов (например, косая черта) в этих других ответах заставляет меня задаться вопросом, насколько они универсальны. например, я пытаюсь написать приложение Electron, не зависящее от платформы, и, хотя я не доказал это исчерпывающе, я подозреваю, что это самый безопасный способ. Спасибо.
Эндрю Виллемс
На самом деле в этом нет необходимости, поскольку path.join () внутренне использует path.normalize () (который преобразует все разделители путей в текущий / предполагаемый формат ОС) в результирующем объединенном пути перед возвратом. Хотя это не повредит.
iono
56

Самый простой способ - использовать path.resolve:

path.resolve(__dirname, '..', '..');
Ян Фото
источник
действительно правильное решение, поскольку вам не нужно разрешать папку, присоединяясь ../к пути
Жоао Пиментел Феррейра
@ Ян, как называется ".."?
Gaurav
12

Похоже, вам понадобится pathмодуль. ( path.normalizeв частности)

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

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));
Доминик Барнс
источник
11

Если другой модуль вызывает ваш, и вы все равно хотите знать, где находится главный запускаемый файл, вы можете использовать модификацию кода @Jason:

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

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

Таким образом вы узнаете, где именно запускается скрипт.

Джереми Батл
источник
8

Если вы не уверены в том, где находится родитель, это укажет вам путь;

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

fs.readFile(__parentDir + '/foo.bar');
Джейсон Брамвелл
источник
5

Ты можешь использовать

path.join(__dirname, '../..');
Puneet
источник
2

Я запускаю электронное приложение, и я могу получить родительскую папку по path.resolve ()

родитель 1 уровень:path.resolve(__dirname, '..') + '/'

родительский 2 уровня:path.resolve(__dirname, '..', '..') + '/'

グ エ ン ト ゥ ア ン ズ ン
источник
1

это также будет работать:

fs.readFile(`${__dirname}/../../foo.bar`);
Друвин Моди
источник
0

Это отлично работает

path.join(__dirname + '/../client/index.html')
const path = require('path')
const fs = require('fs')
    fs.readFile(path.join(__dirname + '/../client/index.html'))
Ханзла Хабиб
источник