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

148
众所周知,Windows使用反斜杠进行路径表示,而Unix使用正斜杠。node.js提供path.join()来始终使用正确的斜杠。因此,例如,不应该写Unix专用的'a/b/c',而是应该使用path.join('a','b','c')

然而,似乎尽管存在这种差异,如果您没有规范化路径(例如使用path.join)并只是像a/b/c一样编写路径,则node.js在Windows上运行您的脚本也没有问题。

那么相比于'a/b/c',有使用path.join('a','b','c')更好的好处吗?无论平台如何,两者似乎都能正常工作...

4个回答

112

Windows文件系统在路径分隔符上既可以使用正斜杠(/)也可以使用反斜杠(\)(从DOS时代就是这样)。唯一的问题是,Windows命令行处理器(或更具体地说,本机的Windows命令行工具)倾向于将正斜杠解释为选项说明符,而不是路径组件。因此,如果您需要将路径传递给作为子进程运行的Windows命令,则需要使用反斜杠路径。此外,返回路径的Windows API调用和调用Windows API的高级语言方法将使用反斜杠,因此即使您不会将它们传递给子进程,您仍需要对它们进行规范化处理。


正斜杠也会破坏 UNC 路径。 - sam-6174
3
这个答案没有清楚地解释为什么要在典型的 Node.js 应用程序中使用它。或许只是我理解有误。虽然它很有趣。 - Gherman

105

path.join函数会处理路径中可能出现的多余分隔符,这些分隔符可能来自于未知来源(如用户输入、第三方API等)。

因此,path.join('a/','b')path.join('a/','/b')path.join('a','b')path.join('a','/b')都会返回a/b

如果不使用该函数,通常需要对连接的路径的开头和结尾进行假设,并且只有零个或一个斜杠。


1
这听起来有点有用,但从未知来源接收任意未经检查的路径似乎是一个很大的安全问题。这不是经常要做的事情。 - Gherman

51
我使用path.join来确保文件夹分隔符位于正确的位置,而不是必须使用正斜杠或反斜杠。例如:
path.join("/var/www", "test")

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


3
我不理解这个观点。如果你已经有了这些脚本变量,为什么不手动添加一个斜杠呢? - mgol
3
我也有困难理解这个回答。看不出有什么价值。 - oligofren
26
因为我无法确定从其他来源获取的路径值是否带有末尾斜杠。上面的示例是人为构造的。通常这些路径不是硬编码的,而是从其他配置文件、用户输入、库等中提取的。 - Timothy Strimple
@TimothyStrimple ~ дҪҝз”Ёpath.joinзҡ„еҘҪең°ж–№жҳҜдҪ еңЁиҝҷйҮҢзҡ„еҸҰдёҖдёӘзӯ”жЎҲhttps://dev59.com/questions/emox5IYBdhLWcg3wsGaCгҖӮйӮЈдёӘзӯ”жЎҲжҠҠжҲ‘еёҰеҲ°дәҶдҪ еӣһзӯ”зҡ„еҸҰдёҖдёӘй—®йўҳ :) - Pebbl
25
直到5分钟后我的代码在return baseDir + relativePath + filename;处崩溃,我也对那个答案持怀疑态度。我立即用return path.join(baseDir, relativePath, filename);替换它。这确实非常有帮助! - Pedro
显示剩余3条评论

36

简短回答:

所有的fs.*函数 (例如fs.open, 等等) 都为您处理了文件路径名。因此,您不需要自己使用path.join,让您的代码难以理解。

详细回答:

所有的fs.*函数都调用path._makeLong(path),然后调用path.resolve(path),Windows版有专门的正则表达式,考虑反斜杠\或正斜杠/。您可以查看它们的源代码:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接