【问题标题】:Difference between path.normalize and path.resolve in Node.jsNode.js 中 path.normalize 和 path.resolve 的区别
【发布时间】:2012-06-05 01:25:35
【问题描述】:

path.normalize(your_path)path.resolve(your_path) 之间有什么区别(如果有)?

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

编辑:如果它们的行为方式相同,我不明白公开path.normalize(...) 函数的目的,因为你可以简单地将路径传递给path.resolve(...) 或者,也许, 用于文档目的。例如,他们在path.resolve(...) 的文档中说:

...生成的路径被规范化,并且...

暴露path.normalize(...) 更容易解释“规范化”是什么意思?我不知道。

【问题讨论】:

    标签: node.js path


    【解决方案1】:

    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() 是上下文-dependent(即,如果它考虑了当前工作目录),上面示例中的结果将是../node,因为这是最短路径之一可以从/Users/mtilley/src/testing/Users/mtilley/src/node

    具有讽刺意味的是,这意味着path.resolve() 产生了一个绝对路径的相对路径(你可以在任何地方执行它,它会产生相同的结果),而path.normalize() 产生一个相对路径的绝对路径(你必须执行它在要计算绝对结果的相对路径中)。

    【讨论】:

    • 另外请注意 path.normalize 可以处理您可能想要规范化的任何路径,并且仅表示对路径的字符串操作,而 path.resolve 将使用文件系统和当前目录将路径解析为绝对路径小路。这使得它们的行为完全不同,因为 path.normalize 可能用于 tar 文件内的路径、远程文件系统或完全抽象的东西。
    • 它们与 path.join 有何不同?
    • 让我对文档感到困惑的是path.normalize() 不会从路径的开头删除../。如果它是相对路径,它不会将它与 cwd 结合起来。我想不出任何时候我只想使用path.normalize() 而不是path.resolve()
    【解决方案2】:

    来自文档:

    将 resolve 理解为 shell 中的一系列 cd 命令。

    链接到文档中的path.resolvepath.normalize。我主要不想只在答案中提供链接,但 Node.js 文档非常不错。

    【讨论】:

    • 当您可以简单地将路径传递给 path.resolve(...) 时,我想我不明白公开 normalize(...) 函数的目的
    • 您正在规范化的路径可能实际上并不存在于文件系统中,例如您可能正在规范您将要创建的文件的路径,或者您可能正在规范相对 URL 路径。
    • 其实我也不知道你为什么要使用 normalize 而不是 resolve。
    • normalize 不会将路径完成为绝对路径。因此,它可以用于获取某些资源相对于另一个资源的合理路径,例如,可以在 HTML 中使用该路径来引用用户选择的文件。由于规范化路径总是很简单(没有额外的../),因此可以轻松检查以确保用户只选择来自特定位置的文件,并且没有机会查看该位置以外的私人文件。
    • @BMiner 实际上, path.normalize() 对于在 Electron 应用程序中传回图像 SRC 路径非常有用。出于此类目的,您不能将绝对系统路径传回 ipcRenderer。 SRC 属性只能是绝对 URL、数据、基本或相对路径。
    猜你喜欢
    • 2016-05-05
    • 2020-12-07
    • 2020-01-16
    • 1970-01-01
    • 2023-03-22
    • 2016-07-24
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多