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


Ответы:


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


4
'foo.bar' должен быть 'foo.bar'. Я попытался внести правки, но редактирование должно быть минимум 6 символов (глупое правило, если вы спросите меня, не позволяет нам редактировать небольшие опечатки, подобные этой).
user1767586

1
Подозреваю, что это лучший ответ. Некоторые из других ответов могут работать для данного человека в данной операционной системе, но наличие определенного типа разделителя иерархии файлов (например, косая черта) в этих других ответах заставляет меня задаться вопросом, насколько они универсальны. например, я пытаюсь написать приложение Electron, не зависящее от платформы, и, хотя я не доказал это исчерпывающе, я подозреваю, что это самый безопасный способ. Спасибо.
Эндрю Виллемс

На самом деле в этом нет необходимости, поскольку path.join () внутренне использует path.normalize () (который преобразует все разделители путей в текущий / предполагаемый формат ОС) в результирующем объединенном пути перед возвратом. Хотя это не повредит.
iono



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


2

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

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

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



0

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

path.join(__dirname + '/../client/index.html')
const path = require('path')
const fs = require('fs')
    fs.readFile(path.join(__dirname + '/../client/index.html'))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.