Różnica między path.normalize i path.resolve w Node.js.

86

Jaka jest różnica (jeśli w ogóle) między path.normalize(your_path)i path.resolve(your_path)?

Wiem, że path.resolve(...)mogę akceptować wiele argumentów, ale czy zachowanie z jednym argumentem jest takie samo jak wywołanie path.normalize()?

EDYCJA: Jeśli mają zachowywać się w ten sam sposób, nie rozumiem celu ujawnienia path.normalize(...)funkcji, skoro można po prostu przekazać ścieżkę do path.resolve(...)lub może to dla celów dokumentacyjnych. Na przykład mówią w dokumentacji dla path.resolve(...):

... Wynikowa ścieżka jest znormalizowana i ...

Ujawnienie znaku path.normalize(...)ułatwia wyjaśnienie, co oznacza „znormalizowany” ??? Nie wiem.

BMiner
źródło

Odpowiedzi:

182

path.normalizepozbywa Extra ., ..itp na ścieżce. path.resolveprzekształca ścieżkę w ścieżkę absolutną. Przykład (mój aktualny katalog roboczy to /Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

Innymi słowy, path.normalizebrzmi: „Jaka jest najkrótsza ścieżka, jaką mogę wybrać, która zaprowadzi mnie do tego samego miejsca, co wejście”, a path.resolve„Jaki jest mój cel, jeśli podążę tą ścieżką”.

Zauważ jednak, że path.normalize() jest to znacznie bardziej niezależne od kontekstu niż path.resolve(). Miał path.normalize()być od kontekstu de wisząca (czyli gdyby wziąć pod uwagę aktualny katalog roboczy), wynik w powyższym przykładzie byłby już ../node, bo to najkrótsza droga może zająć jeden z /Users/mtilley/src/testingna /Users/mtilley/src/node.

Jak na ironię, oznacza to, że path.resolve()tworzy ścieżkę względną w kategoriach bezwzględnych (możesz ją wykonać w dowolnym miejscu i dałoby to ten sam wynik), podczas gdy path.normalize()tworzy ścieżkę bezwzględną w kategoriach względnych (musisz wykonać ją na ścieżce, względem której chcesz obliczyć wynik bezwzględny).

Michelle Tilley
źródło
Ładny. Dziękuję za odpowiedź! Dręczyło mnie to od jakiegoś czasu. Dokumentacja Node, choć zazwyczaj jest całkiem niezła, w tej sprawie mnie trochę zdziwiła.
BMiner
14
Zauważ również, że path.normalize może obsługiwać dowolne ścieżki, które chcesz znormalizować, i oznacza tylko manipulację ciągami ścieżek, podczas gdy path.resolve użyje systemu plików i bieżącego katalogu do rozstrzygnięcia ścieżki na ścieżkę bezwzględną. To sprawia, że ​​zachowują się zupełnie inaczej, niż path.normalize może być użyty na ścieżce wewnątrz pliku tar, na zdalnym systemie plików lub czymś całkowicie abstrakcyjnym.
Nakedible
Czym się różnią od path.join?
Vijey
2

Z dokumentów:

Innym sposobem myślenia o rozwiązaniu jest sekwencja poleceń cd w powłoce.

Linki do path.resolve i path.normalize w dokumentacji. Przeważnie nie chcę podawać linków w odpowiedzi, ale dokumenty Node.js są bardzo przyzwoite.

Pickels
źródło
Chyba nie rozumiem celu ujawnienia funkcji normalizacji (...), kiedy można po prostu przejść ścieżkę do ścieżki. Rozwiązać (...)
BMiner
6
Ścieżka, którą normalizujesz, może w rzeczywistości nie istnieć w systemie plików, np. Możesz normalizować ścieżkę do pliku, który zamierzasz utworzyć, lub możesz normalizować względne ścieżki URL.
lanzz
Właściwie nie wiem też, dlaczego miałbyś użyć normalizacji zamiast rozstrzygania.
Pickels
1
normalizacja nie kończy ścieżki do ścieżki absolutnej. Więc może być użyty do uzyskania rozsądnej ścieżki dla niektórych zasobów względem innego zasobu, która może być użyta wewnątrz HTML do odniesienia się na przykład do pliku wybranego przez użytkownika. Ponieważ znormalizowana ścieżka jest zawsze prosta (bez dodatkowych ../), można ją łatwo sprawdzić, aby upewnić się, że użytkownik wybiera pliki tylko z określonych lokalizacji i nie ma szans na przeglądanie prywatnych plików poza tymi lokalizacjami.
dronus,