Czy musisz używać path.join w node.js?

138

jak wszyscy wiedzą, Windows tworzy ścieżki z ukośnikami odwrotnymi, podczas gdy Unix tworzy ścieżki z ukośnikami w przód. node.js zapewnia, path.join()aby zawsze używać prawidłowego ukośnika. Na przykład zamiast pisać o Uniksie, tylko 'a/b/c'ty byś zrobił path.join('a','b','c').

Wydaje się jednak, że pomimo tej różnicy, jeśli nie znormalizujesz swoich ścieżek (np. Używając path.join) i po prostu napiszesz ścieżki takie jak a/b/cnode.js nie ma problemu z uruchomieniem skryptów w systemie Windows.

Więc jest jakaś korzyść przez pisanie path.join('a','b','c')na 'a/b/c'? Oba wydają się działać niezależnie od platformy ...

balupton
źródło

Odpowiedzi:

107

Systemy plików Windows nie mają problemu z używaniem ukośników w przód lub w tył jako separatorów ścieżek (tak było od czasów DOS). Jedynym prawdziwym problemem jest to, że procesory wiersza poleceń systemu Windows (a dokładniej narzędzia wiersza poleceń systemu Windows) mają tendencję do interpretowania ukośników jako specyfikatorów opcji, a nie składników ścieżki. Dlatego ścieżka z odwrotnym ukośnikiem jest potrzebna, jeśli chcesz przekazać ścieżkę do polecenia systemu Windows uruchamianego jako podproces. Ponadto wywołania interfejsu API systemu Windows (i metody z języków wyższego poziomu, które wywołują interfejs API systemu Windows), które zwracają ścieżki, będą używać ukośników odwrotnych, więc nawet jeśli nie przekazujesz ich do podprocesów, musisz je znormalizować.

ebohlman
źródło
Ukośniki w przód również przerywają ścieżki UNC.
user2426679
1
Ta odpowiedź nie wyjaśnia, dlaczego używać go w typowych aplikacjach Node.js. A może po prostu ja tego nie rozumiem. Chociaż to było interesujące.
Gherman
98

path.join zajmie się niepotrzebnymi ogranicznikami, które mogą wystąpić, jeśli podane ścieżki pochodzą z nieznanych źródeł (np. dane wejściowe użytkownika, zewnętrzne interfejsy API itp.).

Tak path.join('a/','b') path.join('a/','/b'), path.join('a','b')i path.join('a','/b')będzie wszystko dać a/b.

Bez jej używania zazwyczaj można by oczekiwać od początku i końca połączonych ścieżek, wiedząc, że nie mają one tylko jednego ukośnika.

dronus
źródło
Brzmi to trochę przydatne, ale otrzymywanie dowolnych niekontrolowanych ścieżek z nieznanych źródeł brzmi jak duży problem z bezpieczeństwem. To nie jest częste.
Gherman
50

Używam, path.joinaby upewnić się, że separatory folderów znajdują się we właściwych miejscach, niekoniecznie aby upewnić się, że używa ukośników do przodu i do tyłu. Na przykład:

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

Poprawnie wstawi separator między www i test /var/www/test

Timothy Strimple
źródło
2
Nie rozumiem tego punktu. Jeśli masz te skrypty w zmiennych, dlaczego nie dodać ręcznie ukośnika?
mgol
2
Mam też kłopoty ze zrozumieniem tej odpowiedzi. Nie można zobaczyć żadnej wartości.
oligofren
24
Ponieważ nie zawsze jestem pewien, czy wartości ścieżek, które otrzymuję z innych źródeł, będą miały końcowe ukośniki, czy nie. Mój powyższy przykład został wymyślony. Często te ścieżki nie są zakodowane na
stałe
@TimothyStrimple ~ dobrym miejscem do wykorzystania path.joinbyłoby w innej odpowiedzi tutaj stackoverflow.com/questions/9027648/… . Ta odpowiedź doprowadziła mnie tutaj do kolejnego pytania, na które odpowiedziałeś sam :)
Pebbl
23
Byłem też sceptyczny co do tej odpowiedzi aż do 5 minut później mój kod wybuchł return baseDir + relativePath + filename;. Zastąpiłem go od razu return path.join(baseDir, relativePath, filename);. To naprawdę bardzo pomocne!
Pedro,
34

Krótka odpowiedź:

Wszystkie fs.*funkcje (np. fs.openItp.) Traktują nazwę ścieżki za Ciebie. Nie musisz więc używać path.joinsiebie i czynić swojego kodu nieczytelnym.

Długa odpowiedź:

Wszystkie fs.*funkcje wywołują path._makeLong(path), które z kolei wywołują path.resolve(path), który ma specjalne wyrażenie RegExps dla Windows, które uwzględnia ukośnik odwrotny \lub ukośnik w przód /. Możesz to sprawdzić na własne oczy, przeglądając ich kod źródłowy pod adresem:

Rafael Xavier
źródło