Node.js'de path.join kullanmanız gerekiyor mu?


135

herkesin bildiği gibi, Windows, Unix'in eğik çizgilerle yaptığı yolları ters eğik çizgilerle yapar. node.js path.join()her zaman doğru eğik çizginin kullanılmasını sağlar. Örneğin, Unix'i yazmak yerine sadece 'a/b/c'siz yaparsınız path.join('a','b','c').

Ancak, bu farka rağmen, yollarınızı normalleştirmezseniz (örneğin, path.join kullanarak) ve sadece a/b/cnode.js gibi yollar yazarsanız, komut dosyalarınızı Windows üzerinde çalıştırmada sorun olmaz.

Yani üzerine yazmaktan herhangi bir yararı vardır path.join('a','b','c')üzerinde 'a/b/c'? Her ikisi de platformdan bağımsız olarak çalışıyor gibi görünüyor ...

Yanıtlar:


106

Windows dosya sistemleri, yol ayırıcı olarak ileri veya geri eğik çizgileri kullanmakta sorun yaşamaz (DOS günlerinden beri bu durum böyleydi). Tek gerçek sorun, Windows komut satırı işlemcilerinin (veya daha spesifik olarak Windows yerel komut satırı yardımcı programlarının) eğik çizgileri yol bileşenleri yerine seçenek belirleyicileri olarak yorumlama eğiliminde olmasıdır. Bu nedenle, alt işlem olarak çalıştırılan bir Windows komutuna giden yolu iletmeniz gerekiyorsa, ters eğik çizgili bir yola ihtiyacınız vardır. Ayrıca, dönüş yollarını döndüren Windows API çağrıları (ve Windows API'yi çağıran daha üst düzey dillerden yöntemler) ters eğik çizgi kullanacaktır, bu nedenle onları alt işlemlere geçirmeseniz bile bunları normalleştirmeniz gerekir.


Eğik çizgiler ayrıca UNC yollarını da bozar.
user2426679

Bu cevap, tipik Node.js uygulamalarında neden kullanıldığını netleştirmez. Ya da belki anlamıyorumdur. İlginç olmasına rağmen.
Gherman

97

path.join verilen yollar bilinmeyen kaynaklardan (örn. kullanıcı girdisi, 3. parti API'ler vb.) geliyorsa ortaya çıkabilecek gereksiz sınırlayıcılarla ilgilenecektir.

Yani path.join('a/','b') path.join('a/','/b'), path.join('a','b')ve path.join('a','/b')tüm verecektir a/b.

Kullanmadan, genellikle bir eğik çizgiye sahip olmadıklarını veya bir eğik çizgiye sahip olduklarını bilerek, genellikle birleştirilen yolların başlangıcı ve bitişi hakkında beklentilerde bulunursunuz.


Bu kulağa biraz kullanışlı geliyor, ancak bilinmeyen kaynaklardan rastgele kontrol edilmeyen yollar almak büyük bir güvenlik sorunu gibi görünüyor. Bu sık sık yapılacak bir şey değil.
Gherman

50

Kullandığım path.joinayırıcıları doğru yerlere içindedir klasör sağlamak için mutlaka geri eğik çizgi karşı ileri kullanmasını sağlamak için. Örneğin:

path.join("/var/www", "test")

Ayırıcıyı www ve test arasına doğru şekilde yerleştirecek /var/www/test


2
Bu noktayı anlamıyorum. Değişkenlerde bu komut dosyalarınız varsa, neden elle bir bölü çizgisi eklemiyorsunuz?
mgol

2
Ben de bu cevabı anlamakta güçlük çekiyorum. Herhangi bir değer göremiyorum.
oligofren

23
Çünkü diğer kaynaklardan aldığım yol değerlerinin sonunda eğik çizgi olup olmayacağından her zaman emin değilim. Yukarıdaki örneğim uydurulmuştu. Genellikle bu yollar sabit kodlanmamıştır, ancak diğer yapılandırma dosyalarından, kullanıcı girdilerinden, kitaplıklardan vb.
Çekilir

@TimothyStrimple ~ Kullanmak için iyi bir yer path.joinburadaki diğer cevabınızda olacaktır stackoverflow.com/questions/9027648/… . Bu cevap beni burada kendi kendinizin cevapladığı başka bir soruya yönlendirdi :)
Pebbl

23
Ben de 5 dakika sonra kodum patlayana kadar bu cevap konusunda şüpheliydim return baseDir + relativePath + filename;. Hemen ile değiştirdim return path.join(baseDir, relativePath, filename);. Gerçekten çok yardımcı oluyor!
Pedro

34

Kısa cevap:

Tüm fs.*işlevler (örn. fs.open, Vb.) Sizin için yol adını ele alır. Yani, path.joinkendinizi kullanmanız ve kodunuzu okunaksız hale getirmeniz gerekmez .

Uzun cevap:

Tüm fs.*fonksiyonlar diyoruz path._makeLong(path), hangi dönüş çağrısında path.resolve(path)hesap ters eğik çizgi içine alır Windows için özel regexpleri vardır, \ya da ileri eğik çizgi /. Kaynak kodlarına bakarak kendiniz kontrol edebilirsiniz:

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.