Різниця між path.normalize та path.resolve у Node.js


86

Яка різниця (якщо така є) між path.normalize(your_path)та path.resolve(your_path)?

Я знаю, що path.resolve(...)можу приймати кілька аргументів, але чи поведінка з одним аргументом така ж, як виклик path.normalize()?

РЕДАГУВАТИ: Якщо вони повинні поводитись однаково, я не розумію мету викриття path.normalize(...)функції, коли ви можете просто передати шлях у, path.resolve(...)Або, можливо, це для цілей документації. Наприклад, у документації сказано path.resolve(...):

... Отриманий шлях нормалізується, і ...

Викриваючи path.normalize(...)це, легше пояснити, що означає "нормоване" ??? Я не знаю.

Відповіді:


182

path.normalizeпозбавляється від позикового ., ..і т.д. в дорозі. path.resolveвирішує шлях в абсолютний шлях. Приклад (мій поточний робочий каталог був /Users/mtilley/src/testing):

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

Іншими словами, path.normalizeце "Який найкоротший шлях я можу пройти, який приведе мене туди ж, де і вхід", тоді path.resolveяк "Який мій пункт призначення, якщо я піду цим шляхом".

Однак зверніть увагу, що path.normalize()це набагато більше не залежить від контексту, ніж path.resolve(). Якщо б path.normalize()був context- де незакінчений (тобто якщо вона взяла до уваги поточний робочий каталог), результат у наведеному вище прикладі був би ../node, тому що це найкоротший шлях можна було б взяти з /Users/mtilley/src/testingдо /Users/mtilley/src/node.

За іронією долі, це означає, що path.resolve()виробляється відносний шлях в абсолютних значеннях (ви можете виконати його де завгодно, і це дасть той самий результат), тоді як path.normalize()виробляє абсолютний шлях у відносному вираженні (ви повинні виконати його в шляху, щодо якого ви хочете обчислити абсолютний результат).


Приємно. Дякую за відповідь! Це мене певною мішкою хвилює. Документи Node, хоча вони, як правило, досить приємні, мене трохи здивували.
BMiner

14
Також зауважте, що path.normalize може обробляти будь-які шляхи, які ви хочете нормалізувати, і означає лише маніпулювання рядком шляху, тоді як path.resolve використовуватиме файлову систему та поточний каталог для вирішення шляху до абсолютного шляху. Це змушує їх поводитися зовсім по-іншому, оскільки path.normalize може бути використаний на шляху до файлу tar, у віддаленій файловій системі або на чомусь абсолютно абстрактному.
Голий,

Чим вони відрізняються від path.join?
Vijey

2

З документів:

Інший спосіб роздумувати - це послідовність команд cd в оболонці.

Посилання на path.resolve та path.normalize у документації. Я здебільшого не хочу просто надавати посилання у відповіді, але документи Node.js дуже пристойні.


Напевно, я не розумію мету викриття функції нормалізації (...), коли ви можете просто передати шлях у path.resolve (...)
BMiner

6
Шлях, який ви нормалізуєте, насправді може не існувати у файловій системі, наприклад, ви можете нормалізувати шлях до файлу, який ви збираєтеся створити, або ви можете нормалізувати відносні шляхи URL.
lanzz

Насправді я не знаю, чому б ви використовували нормалізацію над вирішенням.
Пікельс

1
нормалізувати не завершує шлях до абсолютного шляху. Таким чином, він може бути використаний для отримання розумного шляху для деяких джерел відносно іншого ресурсу, який може використовуватися всередині HTML для посилання на файл, вибраний користувачем, наприклад. Оскільки нормалізований шлях завжди простий (без зайвих ../), його можна легко перевірити, щоб переконатися, що користувач вибирає файли лише з певних місць і не має можливості переглядати приватні файли за межами цих місць.
dronus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.