path.resolve 和 path.join 有啥区别?

Posted

技术标签:

【中文标题】path.resolve 和 path.join 有啥区别?【英文标题】:What's the difference between path.resolve and path.join?path.resolve 和 path.join 有什么区别? 【发布时间】:2016-05-05 01:45:06 【问题描述】:

以下调用之间有什么区别吗?

path.join(__dirname, 'app')

对比

path.resolve(__dirname, 'app')

应该首选哪一个?

【问题讨论】:

这个问题是 being discussed 在 meta 【参考方案1】:

这两个函数以非常不同的方式处理以/ 开头的段; join 只会将它与前一个参数连接起来,但是 resolve 会将其视为根目录,并忽略所有以前的路径 - 将其视为对每个参数执行 cd 的结果:

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'

要注意的另一件事是path.resolve 将始终生成一个绝对 URL,并将使用您的工作目录作为解析此路径的基础。但是因为__dirname 无论如何都是绝对路径,所以这对你来说并不重要。

至于你应该使用哪一个,答案是:这取决于你希望以/ 开头的段的行为方式——它们应该被简单地加入还是应该充当新的根?

如果其他参数是硬编码的,那真的没关系,在这种情况下,您可能应该考虑 (a) 该行将来可能会如何变化,以及 (b) 它与代码中其他地方的一致性如何。

【讨论】:

如果还是不明白:path.join('/a', '/b', 'c') 将返回/a/b/c,而path.resolve('/a', '/b', 'c') 将返回/b/c 我会说resolve的名字不是最清楚的,path.cd([starting dir], [final dir])会更直观。 think of it as the result of executing cd with each argument 让我终于明白了。谢谢 @JoãoPimentelFerreira,我已经更新了上面的答案,因为您提出了一个有效的观点。 :) so path.resolve => 以工作目录为路径起点解析路径?【参考方案2】:

文件系统路径的默认操作因操作系统而异,我们需要一些对其进行抽象的东西。 path 模块提供用于处理文件和目录的实用程序或 API 路径。 您可以使用

将其包含在您的项目中
const path = require('path');

path.joinpath.resolve 是路径模块的两种不同方法。

这两种方法都接受一系列路径或路径段。

path.resolve() 方法将一系列路径或路径段解析为绝对路径

path.join() 方法使用平台特定的分隔符作为分隔符将所有给定的路径段连接在一起,然后规范化生成的路径。

为了更好的理解和区分行为,我用不同的场景来解释一下。

1.如果我们不提供任何参数或空字符串

在我的例子中,我的文件名是index.js,当前工作目录是E:\MyFolder\Pjtz\node

const path = require('path');

console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname of the node process

运行结果如下

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

上述实验的推论是 path.resolve() 方法将输出 绝对路径 其中 path.join() 返回。表示当前工作目录或相对路径(如果没有提供)

2。添加 /path 作为任何参数。

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

结果是

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

我们可以从这个实验中找到的推论是 path.join() 仅将输入列表与特定于平台的分隔符连接起来,而 path.resolve() 处理从右到左的路径序列,每个后续路径都在前面添加,直到构造绝对路径。

path.join() 将每个参数与操作系统特定的分隔符连接起来,而path.resolve() 将使用 root 解析每个参数并产生输出。

【讨论】:

path.resolve()__dirname不等效。第一个返回工作目录,第二个是当前文件的路径。 @EmileBergeron 据我了解,它们都是路径上的功能。您可以尝试跟随 sn-p 来检查我认为两者是否相同。 const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname) 仅当正在运行的文件在当前工作目录中时它们才恰好相同。 @EmileBergeron 好的,我同意。但我仍然对我指定的位置感到困惑 path.resolve() is equivalent to __dirname @EmileBergeron 我已经更新了评论,我认为它会解决混乱【参考方案3】:

1) path.resolve 创建绝对路径。

该方法创建从右到左的绝对路径,直到构造出绝对路径。

例如:

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

如果没有生成绝对路径,使用当前工作目录的方法:

例如:

path.resolve('a', 'b', 'c');     //    C:\current_working_directory\a\b\c

2) path.join 加入所有路径并归一化结果

例如:

path.join('/a', '/b', '/c');   //   \a\b\c
path.join('/a', '/b', 'c');    //   \a\b\c
path.join('/a', 'b', 'c');     //   \a\b\c
path.join('a', 'b', 'c');      //   \a\b\c

【讨论】:

最后一个连接示例 path.join('a','b','c') 应该导致 a\b\c【参考方案4】:

用最简单的术语:

path.resolve() 只是执行以下操作

from left to right-

将最右边的参数与/ 直接与根路径连接以形成绝对路径(查看示例) 然后将没有/ 的任何内容连接为目录

以谢尔盖为例

path.resolve('/a', 'b', 'c');     returns    C:\a\b\c
path.resolve('/a', '/b', 'c');    returns    C:\b\c
path.resolve('/a', '/b', '/c');   returns    C:\c

join 只是从左到右连接每个参数,无论它们是否具有/

path.join("/a", "b", "/c", "d")   simply returns   "\a\b\c\d"

【讨论】:

以上是关于path.resolve 和 path.join 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

path.join()和path.resolve()的区别

path的join和resolve的使用区别

path.join()和path.resolve()区别

path.resolve()和path.join()的区别

node模块之path——path.join和path.resolve的区别

path.join()与path.resolve()区别