2012-03-18 9 views
108

jak każdy wie, Windows robi ścieżki z ukośnikami odwrotnymi, gdzie uniks robi ścieżki z ukośnikami. Node.js zapewnia path.join(), aby zawsze używać poprawnego ukośnika. Na przykład zamiast pisać tylko uniksowe 'a/b/c' zrobiłbyś zamiast tego path.join('a','b','c').Czy chcesz użyć pliku path.join w pliku Node.js?

Wydaje się jednak, że mimo tej różnicy, jeśli nie znormalizować swoje ścieżki (na przykład za pomocą path.join) i po prostu napisać ścieżki jak a/b/c node.js nie ma problemu z systemem skryptów na windows ...

Czy są jakieś korzyści związane z pisaniem path.join('a','b','c') przez 'a/b/c'? jak pojawiają się zarówno do pracy niezależnie od platformy ...

Odpowiedz

90

systemów plików systemu Windows nie mają problemu z wykorzystaniem do przodu lub do tyłu ukośniki jako separatory ścieżek (był to przypadek, ponieważ w czasach DOS). Jedynym prawdziwym problemem jest to, że procesory wiersza polecenia systemu Windows (lub, dokładniej, Windows rodzimych narzędzi wiersza polecenia) mają tendencję do interpretowania ukośniki jako specyfikatorami opcji zamiast elementów ścieżki. Dlatego potrzebna jest ścieżka wsteczna, jeśli trzeba przekazać ścieżkę do polecenia systemu Windows uruchamianego jako podproces. Również wywołania interfejsu Windows API (i metody z języków wyższego poziomu, które wywołują interfejs API systemu Windows), które zwracają ścieżki, używają odwróconych ukośników, więc nawet jeśli nie przekazujesz ich do podprocesów, musisz je znormalizować.

+0

Ukośniki naprzód również łamią ścieżki UNC. – user2426679

40

używam paths.join celu zapewnienia folderu separatory są w odpowiednich miejscach, niekoniecznie w celu zapewnienia, że ​​używa go do przodu w porównaniu z powrotem ukośniki. Na przykład:

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

poprawnie wstawić separator między www i testu /var/www/test

+1

Nie rozumiem tego punktu.Jeśli posiadasz te skrypty w zmiennych, dlaczego nie dodasz ręcznie slasha? – mgol

+1

Mam również problemy ze zrozumieniem tej odpowiedzi. Nie widzę żadnej wartości. – oligofren

+17

Ponieważ nie zawsze jestem pewien, czy wartości ścieżek otrzymywane z innych źródeł będą miały końcowe ukośniki, czy nie. Mój przykład powyżej był wymyślony. Często te ścieżki nie są zakodowane na stałe, ale są pobierane z innych plików konfiguracyjnych, danych wejściowych użytkownika, bibliotek itd. –

27

Krótka odpowiedź:

Wszystko fs.* funkcje (Np. fs.open itp) traktuje ścieżkę dla Ciebie. Nie musisz więc samodzielnie używać kodu path.join, aby kod był nieczytelny.

Długa odpowiedź:

Wszystkie funkcje fs.* zadzwonić path._makeLong(path), co z kolei wezwanie path.resolve(path), który ma specjalne wyrażeń regularnych dla Windows, który uwzględnia backslashem \ lub ukośniki /. Można to sprawdzić na własne oczy patrząc swój kod źródłowy w:

73

path.join zajmie zbędnych ograniczniki, które mogą wystąpić, jeśli podane pathes przyjść z nieznanych źródeł (np. dane wejściowe użytkownika, zewnętrzne interfejsy API itp.).

Więc path.join('a/','b')path.join('a/','/b'), path.join('a','b') i path.join('a','/b') będą wszystkie dają a/b.

Bez korzystania z niego zwykle oczekuje się, że do początku i końca dołączą daszki, wiedząc, że nie mają one nic lub jednego ukośnika.