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

Respostas:

277

Tente o seguinte:

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

Observe a barra no início do caminho relativo.

Andrew Hare
fonte
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.

Alex Wayne
fonte
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

smremde
fonte
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
55

A maneira mais fácil seria usar path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
fonte
na verdade, a solução correta, pois você não precisa resolver a pasta juntando ../- se ao caminho
João Pimentel Ferreira
@Yan, como é chamado '..'?
gaurav
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"));
Dominic Barnes
fonte
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.

Jeremy Battle
fonte
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');
Jason Brumwell
fonte
5

Você pode usar

path.join(__dirname, '../..');
puneet
fonte
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, '..', '..') + '/'

グ エ ン ト ゥ ン ン ン
fonte
1

isso também funcionará:

fs.readFile(`${__dirname}/../../foo.bar`);
Dhruvin modi
fonte