fs: bir üst klasörü nasıl bulurum?


195

Bir dosyayı bulmak için üst 2 seviyeye çıkmak için bunu nasıl yazarım?

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

Yanıtlar:


279

Bunu dene:

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

Göreli yolun başındaki eğik çizgiye dikkat edin.


25
Bunu hiç şanssız deniyordum ama yaptım fs.readFile(__dirname + '/../../foo.bar');ve işe yaradı.
fantezi

6
Bunun ardından varsayıyorum __dirnamegibi somthing '/foo/bar'ziyade '/foo/bar/'.
Andrew Hare

3
Yolunuzdaki ilk '/': '/../../foo.bar' çok önemlidir. Sorunuma neden olan '../../foo.bar' vardı.
levibostian

1
neden? neden genellikle? Birisi açıklayabilir mi lütfen?
eyurdakul

Ben corrently bunu anlamak @eyurdakul: __dirnamebenzeyebilir /path/to/your/dirderseniz, __dirname + ".."öyle /path/to/your/dir..ziyade, varolmayan bir dizin olan /path/to/your. Eğik çizgi önemlidir.
joulev

165

Path.join adresini kullanın 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() sizin için önde gelen / sondaki eğik çizgileri ele alır ve sadece doğru olanı yapar ve sondaki eğik çizgiler olduğunda ve yokken hatırlamak zorunda kalmazsınız.


4
Bu cevap path.joinkabul cevap takip edilmemelidir doğru yoldur, hatta tetikler eslintüzerinde airbnb-base preset, kural no-yol-concat özellikle
revelt

100. oy. Benim __dirnameoldu host/src/folderve ben gerekli host/folderve bu, benim için değil OP cevap çalıştı.
carkod

8
bir adım daha ileri gidebilir ve yapabilirsinizpath.join(__dirname, '..', '..', 'foo.bar')
Bay Nobody

Teşekkürler Alex, 6 saatlik aramadan sonra beni kurtardın,
SHOHIL SETHIA

95

Biraz seçici olduğunu biliyorum, ama şu ana kadar tüm cevaplar doğru değil.

Path.join () yöntemi, arayanın hangi dizin ayırıcısının kullanacağını bilmesi ihtiyacını ortadan kaldırmaktır (kod platformunu agnostik hale getirir).

Teknik olarak doğru cevap şuna benzer:

var path = require("path");

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

Bunu Alex Wayne'in cevabına bir yorum olarak ekledim ama henüz yeterli temsilci değil!

EDIT: kullanıcı başına1767586'nın gözlemine göre


4
'foo.bar "' foo.bar 'olmalıdır. Düzenleme yapmaya çalıştım ancak düzenlemelerin minimum 6 karakter olması gerekiyor (bana sorarsan aptal kural, böyle küçük yazım hatalarını düzenlememizi engeller).
user1767586

1
Bunun en iyi cevap olduğundan şüpheleniyorum. Diğer cevapların bazıları olabilir , belirli bir işletim sistemi üzerinde belirli bir birey için çalışır ancak bu diğer cevaplar dosya hiyerarşi ayırıcı belirli bir tür (yani eğik çizgi) varlığı beni ne kadar evrensel meraklandırıyor. Örneğin, platformun agnostik bir şekilde bir Elektron uygulaması yazmaya çalışıyorum ve bunu tam olarak kanıtlamasam da bunun en güvenli yol olduğundan şüpheleniyorum. Teşekkürler.
Andrew Willems

Bu aslında gereksizdir, çünkü path.join () dahili olarak döndürmeden önce sonuçta elde edilen yola path.normalize () (tüm yol ayırıcılarını geçerli / amaçlanan OS formatına dönüştürür) kullanır. Yine de acıtmaz.
iono


12

pathModüle ihtiyacınız olacak gibi görünüyor . ( path.normalizeözellikle)

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

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

11

Başka bir modül sizinkini çağırıyorsa ve çalıştırılmakta olan ana dosyanın konumunu hala bilmek istiyorsanız, @ Jason kodunda değişiklik yapabilirsiniz:

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

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

Bu şekilde çalıştırılan komut dosyasının konumunu alırsınız.


8

Ebeveynin nerede olduğu konusunda olumlu değilseniz, bu size yol verecektir;

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

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

5

Kullanabilirsiniz

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

2

Elektron uygulamasını çalıştırıyorum ve path.resolve () ile üst klasörü alabilirsiniz

ebeveyn 1 seviyesi:path.resolve(__dirname, '..') + '/'

ebeveyn 2 seviyeleri:path.resolve(__dirname, '..', '..') + '/'


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.