fs: bagaimana cara mencari folder induk?

193

Bagaimana cara saya menulis ini untuk kembali ke level induk 2 untuk menemukan file?

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

Jawaban:

277

Coba ini:

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

Perhatikan garis miring di awal jalur relatif.

Andrew Hare
sumber
25
Saya telah mencobanya tanpa hasil tetapi saya berhasil fs.readFile(__dirname + '/../../foo.bar');dan berhasil.
mewah
6
Saya berasumsi bahwa __dirnameitu adalah sesuatu seperti '/foo/bar'bukan '/foo/bar/'.
Andrew Hare
3
Tanda '/' pertama di jalur Anda: '/../../foo.bar' sangat penting. Saya memiliki '../../foo.bar' yang menyebabkan masalah saya.
levibostian
1
Mengapa? secara umum mengapa? bisakah seseorang tolong jelaskan?
eyurdakul
@eyurdakul Jika saya mengerti corrently: __dirnamemungkin terlihat seperti /path/to/your/dir, jika Anda mengatakan __dirname + ".."itu /path/to/your/dir.., yang merupakan direktori tidak ada, bukan /path/to/your. Tebasan itu penting.
JouleV ada di topanswers.xyz
161

Gunakan 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() akan menangani garis miring / garis depan untuk Anda dan hanya melakukan hal yang benar dan Anda tidak perlu mencoba mengingat ketika garis garis miring ada dan ketika garis miring tidak ada.

Alex Wayne
sumber
4
jawaban ini dengan path.joincara yang benar, jawaban yang diterima tidak harus diikuti, bahkan memicu eslintpada airbnb-base preset, aturan tidak ada jalan-concat khususnya
revelt
Suara ke 100 Saya __dirnameadalah host/src/folderdan saya butuhkan host/folderdan ini bekerja untuk saya, bukan jawaban OP.
carkod
8
Anda dapat mengambil satu langkah lebih jauh dan melakukanpath.join(__dirname, '..', '..', 'foo.bar')
Tn. Tidak ada
Terima kasih Alex, Anda menyelamatkan saya setelah 6 jam pencarian,
SHOHIL SETHIA
95

Saya tahu ini agak pilih-pilih, tetapi semua jawaban sejauh ini kurang tepat.

Titik path.join () adalah untuk menghilangkan kebutuhan pemanggil untuk mengetahui pemisah direktori mana yang harus digunakan (membuat platform kode agnostik).

Secara teknis jawaban yang benar adalah:

var path = require("path");

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

Saya akan menambahkan ini sebagai komentar untuk jawaban Alex Wayne tetapi belum cukup perwakilan!

EDIT: sesuai observasi user1767586

smremde
sumber
4
'foo.bar "harus' foo.bar '. Saya mencoba mengedit tetapi pengeditan harus minimum 6 karakter (aturan bodoh jika Anda bertanya kepada saya, mencegah kami mengedit kesalahan ketik kecil seperti ini).
user1767586
1
Saya menduga ini adalah jawaban terbaik. Beberapa jawaban lain mungkin bekerja untuk individu yang diberikan pada sistem operasi yang diberikan, tetapi kehadiran jenis pemisah hierarki file tertentu (yaitu slash) dalam jawaban-jawaban lain membuat saya bertanya-tanya seberapa universal mereka. misalnya saya mencoba untuk menulis aplikasi Elektron dengan cara agnostik platform dan, sementara saya belum membuktikannya secara lengkap, saya menduga ini adalah cara teraman. Terima kasih.
Andrew Willems
Ini sebenarnya tidak perlu, karena path.join () secara internal menggunakan path.normalize () (yang mengubah semua pemisah jalur ke format OS saat ini / yang dituju) pada jalur gabungan yang dihasilkan sebelum kembali. Tidak ada salahnya.
iono
55

Cara termudah adalah menggunakan path.resolve:

path.resolve(__dirname, '..', '..');
Yan Foto
sumber
memang solusi yang tepat karena Anda tidak perlu menyelesaikan folder dengan bergabung ../ke path
João Pimentel Ferreira
@Yan apa namanya '..'?
gaurav
12

Sepertinya Anda akan membutuhkan pathmodul. ( path.normalizekhususnya)

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

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

Jika modul lain memanggil modul Anda dan Anda masih ingin tahu lokasi file utama sedang dijalankan, Anda dapat menggunakan modifikasi kode @ Jason:

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

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

Dengan begitu Anda akan mendapatkan lokasi skrip benar-benar dijalankan.

Jeremy Battle
sumber
8

Jika Anda tidak positif di mana orang tua berada, ini akan memberi Anda jalan;

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

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

Kamu bisa memakai

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

Saya menjalankan aplikasi elektron dan saya bisa mendapatkan folder induk dengan path.resolve ()

level induk 1:path.resolve(__dirname, '..') + '/'

level induk 2:path.resolve(__dirname, '..', '..') + '/'

グ エ ン ト ゥ ア ン ズ ン
sumber
1

ini juga akan berfungsi:

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