fs: як знайти батьківську папку?


194

Як мені написати це, щоб повернути назад 2 батьківського рівня, щоб знайти файл?

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

Відповіді:


279

Спробуйте це:

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

Зверніть увагу на пересічку вперед на початку відносного шляху.


25
Я намагався це не пощастило, але я просто зробив, fs.readFile(__dirname + '/../../foo.bar');і це спрацювало.
фантазія

6
Я припускаю, що це __dirnameбуло щось подібне, '/foo/bar'а не щось '/foo/bar/'.
Ендрю Заєць

3
Найперше "/" на вашому шляху: '/../../foo.bar' є вирішальним. У мене був "../../foo.bar", який спричинив мою проблему.
levibostian

1
чому? просто взагалі чому? може хтось, будь ласка, пояснить?
eyurdakul

@eyurdakul Якщо я це розумію по-справжньому: __dirnameможе виглядати так /path/to/your/dir, якщо ви скажете, __dirname + ".."що це так /path/to/your/dir.., що це неіснуючий каталог, а не /path/to/your. Нахил важливий.
joulev

164

Використовуйте 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і це працювало на мене, а не на відповідь ОП.
carkod

8
ви можете зробити його на крок далі і зробитиpath.join(__dirname, '..', '..', 'foo.bar')
Містер Ніхто

Дякую Алекс, ти врятував мене після 6 годин пошуку,
SHOHIL SETHIA

95

Я знаю, що це трохи прискіпливо, але всі відповіді поки що не зовсім правильні.

Суть path.join () полягає у усуненні потреби абонента, який повинен знати, який роздільник каталогів використовувати (створення кодової платформи агностики).

Технічно правильна відповідь - це щось на зразок:

var path = require("path");

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

Я додав би це як коментар до відповіді Алекса Вейна, але поки недостатньо реп!

EDIT: відповідно до спостереження користувача1767586


4
"foo.bar" має бути "foo.bar". Я намагався внести правки, але правки повинні бути мінімум 6 символів (дурне правило, якщо ви запитаєте мене, заважає нам редагувати такі маленькі друкарські помилки)
user1767586

1
Я підозрюю, що це найкраща відповідь. Деякі з інших відповідей можуть працювати для певної особи в даній операційній системі, але наявність певного виду розділювача ієрархії файлів (тобто косої риски) в цих інших відповідях змушує мене замислитися, наскільки вони універсальні. наприклад, я намагаюся написати програму Electron агностічно, і, хоча це не вичерпно довів, я підозрюю, що це найбезпечніший спосіб. Дякую.
Ендрю Віллемс

Це насправді непотрібно, оскільки path.join () внутрішньо використовує path.normalize () (який перетворює всі роздільники шляху у поточний / призначений формат ОС) на отриманому об'єднаному шляху перед поверненням. Але це не може зашкодити.
іоно

55

Найпростішим способом було б користуватися path.resolve:

path.resolve(__dirname, '..', '..');

дійсно правильне рішення, оскільки вам не потрібно розв’язувати папку, приєднавшись ../до шляху
Жоао Піментел Феррейра

@Yan, що називається ".."?
gaurav



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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.