您是否需要在node.js中使用path.join?


134

众所周知,Windows使用反斜杠执行路径,而Unix使用正斜杠进行路径。node.js提供path.join()了始终使用正确的斜杠。因此,例如,'a/b/c'您不必编写Unix,而只编写Unix path.join('a','b','c')

但是,似乎存在这种差异,但如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如a/b/cnode.js之类的路径,则在Windows上运行脚本没有问题。

那么,有没有写上任何好处path.join('a','b','c')'a/b/c'?无论平台如何,两者似乎都可以工作...

Answers:


106

Windows文件系统使用正斜杠或反斜杠作为路径分隔符都没有问题(从DOS时代开始就是这种情况)。唯一真正的问题是Windows命令行处理器(或更具体地说,Windows本地命令行实用程序)倾向于将正斜杠解释为选项说明符而不是路径组成部分。因此,如果需要将路径传递给作为子进程运行的Windows命令,则需要反斜杠路径。同样,返回路径的Windows API调用(以及来自调用Windows API的高级语言的方法)将使用反斜杠,因此,即使不将其传递给子流程,也需要对其进行规范化。


正斜杠也会破坏UNC路径。
user2426679

这个答案并不清楚为什么在典型的Node.js应用程序中使用它。也许只是我不明白。虽然很有趣。
盖尔曼

95

path.join 将处理不必要的定界符,如果给定路径来自未知来源(例如,用户输入,第三方API等),则可能会出现不必要的定界符。

因此path.join('a/','b') path.join('a/','/b')path.join('a','b')path.join('a','/b')将全部给予a/b

如果不使用它,您通常会知道所加入路径的开始和结束,因为他们知道它们之间没有斜线或只有一个斜线。


这听起来很有用,但是从未知来源接收任意未经检查的路径听起来像是一个很大的安全问题。这不是经常要做的事情。
盖尔曼

50

path.join用来确保文件夹分隔符在正确的位置,而不必确保它使用正斜杠和反斜杠。例如:

path.join("/var/www", "test")

将分隔符正确插入www和test之间 /var/www/test


2
我不明白这一点。如果您在变量中包含这些脚本,为什么不手动添加斜杠呢?
mgol 2013年

2
我也很难理解这个答案。看不到任何值。
oligofren 2014年

23
因为我并不总是确定我从其他来源获得的路径值是否带有斜杠。我上面的例子是人为的。通常这些路径不是硬编码,但正在从其他配置文件,用户输入,图书馆等拉
蒂莫西Strimple

@TimothyStrimple〜一个好的使用场所path.join是你在这里的其他答案stackoverflow.com/questions/9027648/…。这个答案使我
想到

23
直到5分钟后我的代码都炸毁了,我也对这个答案表示怀疑return baseDir + relativePath + filename;。我立即用替换了它return path.join(baseDir, relativePath, filename);。确实非常有帮助!
2014年

34

简短答案:

所有fs.*功能(例如fs.open,等)都会为您处理路径名。因此,您无需使用path.join自己并使代码难以辨认。

长答案:

所有fs.*函数都调用path._makeLong(path),而后者又调用path.resolve(path),后者具有特殊的Windows RegExps,其中考虑了反斜杠\或正斜杠/。您可以在以下位置查看其源代码,以亲自检查一下:

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.