Разница между 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(...)упрощает объяснение того, что означает "нормализованный" ??? Понятия не имею.

BMiner
источник

Ответы:

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, в удаленной файловой системе или в чем-то совершенно абстрактном.
Nakedible
Чем они отличаются от path.join?
Виджей
2

Из документов:

Другой способ думать о разрешении - это последовательность команд cd в оболочке.

Ссылки на path.resolve и path.normalize в документации. В большинстве случаев я не хочу просто давать ссылки в ответе, но документы Node.js очень приличные.

Пикели
источник
Полагаю, я не понимаю цели раскрытия функции normalize (...), когда вы можете просто передать путь в path.resolve (...)
BMiner
6
Путь, который вы нормализуете, может фактически не существовать в файловой системе, например, вы можете нормализовать путь к файлу, который собираетесь создать, или вы можете нормализовать относительные пути URL.
lanzz
На самом деле я не знаю, почему вы также использовали бы нормализацию вместо разрешения.
Пикелс
1
normalize не завершает путь к абсолютному пути. Таким образом, его можно использовать для получения разумного пути для некоторых ресурсов относительно другого ресурса, который можно использовать внутри HTML, например, для ссылки на файл, выбранный пользователем. Поскольку нормализованный путь всегда прост (без лишних ../слов), его можно легко проверить, чтобы убедиться, что пользователь выбирает файлы только из определенных мест и не имеет возможности просматривать личные файлы за пределами этих мест.
dronus