Node.js中path.normalize和path.resolve之间的区别


86

是什么区别(如果有的话)path.normalize(your_path)path.resolve(your_path)

我知道path.resolve(...)可以接受多个参数,但是具有单个参数的行为是否与调用相同path.normalize()

编辑:如果应该以相同的方式运行它们,那么path.normalize(...)当您可以简单地将路径传递给path.resolve(...)Or或可能出于文档目的时,我不理解公开函数的目的。例如,他们在文档中说path.resolve(...)

...生成的路径已标准化,并且...

公开这些内容path.normalize(...)可以更轻松地解释“规范化”的含义????我不知道。

Answers:


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()被上下文悬挂(即,如果它已经考虑到当前的工作目录),结果在上面的例子中会一直../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

从文档:

解决问题的另一种方法是将shell中的cd命令序列。

文档中指向path.resolvepath.normalize的链接。我通常不希望仅在答案中提供链接,但是Node.js文档非常不错。


我想我不明白在只将路径传递到path.resolve(...)时公开normalize(...)函数的目的
BMiner 2012年

6
您正在规范化的路径实际上可能不在文件系统中,例如,您可能正在规范化要创建的文件的路径,或者您正在规范化相对URL路径。
lanzz,2012年

实际上,我也不知道您为什么还要使用规范化过解析。
Pickels

1
规范化不会完成到绝对路径的路径。因此,它可以用于获取某些资源相对于另一资源的合理路径,例如,可以在HTML内部使用该路径引用用户选择的文件。由于标准化路径始终很简单(没有多余的内容../),因此可以轻松地进行检查以确保用户仅从某些位置选择文件,并且没有机会查看此位置之外的私人文件。
dronus 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.