fs: ¿cómo ubico una carpeta principal?

193

¿Cómo escribo esto para volver a los niveles de padre 2 para encontrar un archivo?

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

Respuestas:

277

Prueba esto:

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

Tenga en cuenta la barra diagonal al comienzo de la ruta relativa.

Andrew Hare
fuente
25
Lo había intentado sin suerte, pero lo hice fs.readFile(__dirname + '/../../foo.bar');y funcionó.
elegante
66
Supongo que eso __dirnamefue algo así como '/foo/bar'no '/foo/bar/'.
Andrew Hare
3
El primer '/' en su ruta: '/../../foo.bar' es crucial. Tenía '../../foo.bar' que estaba causando mi problema.
levibostian
1
¿por qué? solo en general ¿por qué? alguien puede por favor explicar?
eyurdakul
@eyurdakul Si entiendo que corrently: __dirnamepuede parecer /path/to/your/dir, si usted dice __dirname + ".."que es /path/to/your/dir.., que es un directorio que no existe, en lugar de /path/to/your. El corte es importante.
JouleV está en topanswers.xyz
161

Utilice 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() manejará las barras diagonales / finales por usted y simplemente hará lo correcto y no tendrá que intentar recordar cuándo existen las barras diagonales finales y cuándo no.

Alex Wayne
fuente
44
esta respuesta con path.joines la forma correcta, la respuesta aceptada no debe ser seguido, incluso desencadena eslinten airbnb-base presetla regla de no-path-concat en particular
Revelt
100o voto a favor. Mi __dirnameera host/src/foldery necesitaba host/foldery esto funcionó para mí, no la respuesta OP.
carkod
8
puedes ir un paso más allá y hacerlopath.join(__dirname, '..', '..', 'foo.bar')
Mr.Nobody
Gracias Alex, me salvaste después de 6 horas de búsqueda,
SHOHIL SETHIA
95

Sé que es un poco exigente, pero todas las respuestas hasta ahora no son correctas.

El punto de path.join () es eliminar la necesidad de que la persona que llama sepa qué separador de directorio usar (haciendo que la plataforma de código sea independiente).

Técnicamente, la respuesta correcta sería algo como:

var path = require("path");

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

¡Hubiera agregado esto como un comentario a la respuesta de Alex Wayne, pero todavía no tengo suficiente representante!

EDITAR: según la observación del usuario 1767586

smremde
fuente
44
'foo.bar "debería ser' foo.bar '. Traté de hacer una edición, pero las ediciones deben tener un mínimo de 6 caracteres (una regla estúpida si me pregunta, nos impide editar pequeños errores tipográficos como este).
user1767586
1
Sospecho que esta es la mejor respuesta. Algunas de las otras respuestas podrían funcionar para un individuo determinado en un sistema operativo dado, pero la presencia de un tipo específico de separador de jerarquía de archivos (es decir, la barra oblicua) en esas otras respuestas me hace preguntarme cuán universales son. Por ejemplo, estoy tratando de escribir una aplicación Electron de manera independiente de la plataforma y, aunque no lo he probado exhaustivamente, sospecho que esta es la forma más segura. Gracias.
Andrew Willems
Esto es realmente innecesario, ya que path.join () usa internamente path.normalize () (que transforma todos los separadores de ruta al formato del sistema operativo actual / previsto) en la ruta unida resultante antes de regresar. Sin embargo, no puede doler.
iono
55

La forma más fácil sería usar path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
fuente
de hecho, la solución correcta ya que no necesita resolver la carpeta uniéndose ../a la ruta
João Pimentel Ferreira
@Yan, ¿cómo se llama '..'?
gaurav
12

Parece que necesitarás el pathmódulo. ( path.normalizeen particular)

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

fs.readFile(path.normalize(__dirname + "/../../foo.bar"));
Dominic Barnes
fuente
11

Si otro módulo llama al suyo y aún desea saber la ubicación del archivo principal que se está ejecutando, puede usar una modificación del código de @ Jason:

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

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

De esa forma obtendrá la ubicación del script que se está ejecutando realmente.

Jeremy Battle
fuente
8

Si no está seguro de dónde está el padre, esto le dará el camino;

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

fs.readFile(__parentDir + '/foo.bar');
Jason Brumwell
fuente
5

Puedes usar

path.join(__dirname, '../..');
puneet
fuente
2

Estoy ejecutando la aplicación de electrones y puedo obtener la carpeta principal por path.resolve ()

Nivel padre 1:path.resolve(__dirname, '..') + '/'

padres 2 niveles:path.resolve(__dirname, '..', '..') + '/'

グ エ ン ト ゥ ア ン ズ ン
fuente
1

esto también funcionará:

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