fs: como localizo uma pasta pai?


193

Como escrevo isso para voltar os níveis pai 2 para encontrar um arquivo?

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

Respostas:


277

Tente o seguinte:

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

Observe a barra no início do caminho relativo.


25
Eu estava tentando isso sem sorte, mas apenas fiz fs.readFile(__dirname + '/../../foo.bar');e funcionou.
chique

6
Estou assumindo que isso __dirnameera algo '/foo/bar'mais do que '/foo/bar/'.
Andrew Hare

3
O primeiro '/' no seu caminho: '/../../foo.bar' é crucial. Eu tinha '../../foo.bar' que estava causando o meu problema.
precisa saber é o seguinte

1
porque? geralmente por que? alguém pode me explicar?
Eyurdakul 16/05/19

@eyurdakul Se eu entendi corretamente: __dirnamepode parecer /path/to/your/dir, se você diz __dirname + ".."que é /path/to/your/dir.., que é um diretório inexistente, e não /path/to/your. A barra é importante.
JouleV está em topanswers.xyz 04/04

161

Use 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() ele lida com barras à esquerda / à direita e faz a coisa certa e você não precisa se lembrar de quando existem barras à direita e quando não existem.


4
esta resposta com path.joiné a maneira correta, a resposta aceita não deve ser seguido, ele ainda provoca eslintem airbnb-base preset, a regra não-path-concat em particular
revelt

100º voto positivo. Eu __dirnameera host/src/foldere eu precisava host/foldere isso funcionou para mim, não a resposta do OP.
precisa saber é

8
você pode dar um passo adiante e fazê-lopath.join(__dirname, '..', '..', 'foo.bar')
Mr. Nobody

Obrigado Alex, você me salvou após 6 horas de pesquisa,
SHOHIL SETHIA

95

Eu sei que é um pouco exigente, mas todas as respostas até agora não estão certas.

O objetivo de path.join () é eliminar a necessidade de o chamador saber qual separador de diretório usar (tornando a plataforma de código independente).

Tecnicamente, a resposta correta seria algo como:

var path = require("path");

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

Eu teria acrescentado isso como um comentário à resposta de Alex Wayne, mas ainda não o suficiente!

EDIT: conforme observação de user1767586


4
'foo.bar "deve ser' foo.bar '. Tentei fazer uma edição, mas as edições precisam ter no mínimo 6 caracteres (regra estúpida, se você me perguntar, nos impede de editar pequenos erros de digitação como este).
user1767586

1
Suspeito que esta seja a melhor resposta. Algumas das outras respostas podem funcionar para um determinado indivíduo em um determinado sistema operacional, mas a presença de um tipo específico de separador de hierarquia de arquivos (ou seja, a barra) nessas outras respostas me faz pensar em como elas são universais. Por exemplo, estou tentando escrever um aplicativo Electron de maneira independente da plataforma e, embora ainda não o tenha provado exaustivamente, suspeito que seja o caminho mais seguro. Obrigado.
Andrew Willems

Isso é realmente desnecessário, pois path.join () usa internamente path.normalize () (que transforma todos os separadores de caminho no formato atual / pretendido do SO) no caminho resultante resultante antes de retornar. Não pode doer, no entanto.
iono


12

Parece que você precisará do pathmódulo. ( path.normalizeem particular)

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

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));

11

Se outro módulo chamar o seu e você ainda quiser saber o local do arquivo principal em execução, use uma modificação do código de @ Jason:

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

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

Dessa forma, você obterá a localização do script realmente sendo executado.


8

Se você não souber onde está o pai ou mãe, isso lhe dará o caminho;

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

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

5

Você pode usar

path.join(__dirname, '../..');

2

Estou executando o aplicativo elétron e posso obter a pasta pai por path.resolve ()

nível pai 1:path.resolve(__dirname, '..') + '/'

pai 2 níveis:path.resolve(__dirname, '..', '..') + '/'


1

isso também funcionará:

fs.readFile(`${__dirname}/../../foo.bar`);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.