【问题标题】:How to check if a path is absolute or relative如何检查路径是绝对路径还是相对路径
【发布时间】:2014-03-09 01:33:48
【问题描述】:

UNIX 绝对路径以“/”开头,而 Windows 以字母“C:”或“\”开头。 node.js 是否有标准的多平台功能来检查路径是绝对路径还是相对路径?

【问题讨论】:

    标签: javascript node.js path directory absolute


    【解决方案1】:

    你可以使用

    path.resolve(yourPath)===yourPath
    

    如果您的路径未标准化,请使用

    path.resolve( yourPath ) == path.normalize( yourPath )
    

    【讨论】:

    • 源代码中还有一个 isAbsolute 函数,即使我在文档中没有找到它并且它似乎不可用:github.com/joyent/node/blob/master/lib/path.js#L206
    • 是的,我不知道为什么文档中没有,但现在我想我会使用你的回复,以确保安全。
    • 该函数实际上处于不稳定状态(0.11),但不是最后一个稳定状态。
    • 如果yourPath 尚未标准化(例如:它不适用于///a//..//b//。正确的解决方案是:path.resolve( yourPath ) == path.normalize( yourPath )
    • 这个答案有点模棱两可。这张支票证明了什么?
    【解决方案2】:

    我对node.js一无所知,但是你可以在github中看到path.js的来源: https://github.com/joyent/node/blob/master/lib/path.js

    你可以看到:

    // windows version
    exports.isAbsolute = function(path) {
        var result = splitDeviceRe.exec(path),
        device = result[1] || '',
        isUnc = device && device.charAt(1) !== ':';
        // UNC paths are always absolute
        return !!result[2] || isUnc;
    };
    

    还有:

    // posix version
    exports.isAbsolute = function(path) {
        return path.charAt(0) === '/';
    };
    

    【讨论】:

      【解决方案3】:

      正如对 dystroy 的回答所评论的那样,如果绝对路径尚未标准化(例如路径:///a//..//b//./),则建议的解决方案不起作用。

      正确的解决方案是:

      path.resolve(yourPath) === path.normalize(yourPath)
      

      正如 Marc Diethelm 在 cmets 中建议的那样,这仍然存在一些问题,因为 path.resolve 会删除尾部斜杠,而 path.normalize 不会。

      我不确定这些函数的具体表现如何(正如您可以在 cmets 中看到的那样),无论如何,以下 sn-p 似乎至少在 Linux 环境中可以正常工作:

      path.resolve(yourPath) === path.normalize(yourPath).replace( RegExp(path.sep+'$'), '' );
      

      【讨论】:

      • 但是,由于normalize 保留了尾部斜杠,因此您的解决方案需要增强。 path.resolve(_yourPath) === path.normalize(_yourPath).replace(/[\/|\\]$/, ''),将可靠地工作。
      • @MarcDiethelm:你说得非常对,我从未注意到。考虑到您的建议,我将尝试修复答案!无论如何,您的解决方案仍然不能完美运行,例如它以'/\\' 失败。是否有任何具体原因要删除尾随反斜杠?是支持windows路径还是其他什么?
      • 在 Windows 上需要准确检查尾部反斜杠。回复:它以'/\\'失败。没看懂,能说清楚吗?那应该是您测试的路径吗?!
      • @MarcDiethelm:是的,完全正确。我在 Linux 机器上运行 Node。如果我将'/\\' 字符串传递给您的函数,path.resolve('/\\') 返回'/\\',而path.normalize('/\\').replace(/[\/|\\]$/, '') 返回'/'。我添加到此响应中的行在 Linux 上似乎对我来说很好,但可能是其他问题(也许在 Windows 上?)
      • 路径'/\\' 对我来说似乎是一个真正的边缘案例。也许先尝试取消转义?我不喜欢在这里调用 RegExp 构造函数及其所有开销。 path.sep 起初看起来不错。但基本上我们只想在比较之前删除任何(Windows 或其他)尾部斜杠。这是我的修改版本,也适用于根 '/' 路径:path.resolve(yourPath) === path.normalize(yourPath).replace(/(.+)([\/|\\])$/, '$1')
      【解决方案4】:

      从节点版本 0.12.0 开始,您可以使用 path 模块中的 path.isAbsolute(path) 函数。

      即:

      var path = require('path');
      if(path.isAbsolute(myPath)) {
          //...
      }
      

      【讨论】:

      • 请注意,无论是在 Windows 还是 Mac 上,isAbsolute 似乎对于任何以 / 开头的路径都返回 true(不确定 *nix)
      • 正如 Alexander Mills 指出的那样,这个答案是错误的。如果您的相对路径以/ 开头(所有相对路径通常都这样做),那么此方法将返回 true,这是错误的。我不知道为什么它被选为正确答案,这很危险,而且很不可靠。
      • @SproutCoder 这个答案是正确的。也许您正在考虑 http URL 意义上的相对路径? Node.js 实用程序path.isAbsolute 旨在用于文件系统路径,其中定义的“绝对路径”以斜杠开头。例如,请参阅linfo.org/path.html
      • 请注意isAbsolute,当在 unix 或类 unix 系统上传递以 ~ 开头的路径时,将返回 false。虽然这些路径确实相对于当前用户的用户目录,但它们与 current 目录无关,因此更改目录不会影响它们解析的内容。从这个意义上说,这些路径是绝对的,这可能会让一些人感到惊讶。
      【解决方案5】:

      这有点令人费解,但我发现仅使用(pre node 0.12.0)路径模块的最可靠的方法

      function isAbsolute(p) {
          return path.normalize(p + '/') === path.normalize(path.resolve(p) + '/');
      }
      

      需要注意的是 path.isAbsolute 从节点 0.12.0 开始存在。

      【讨论】:

        【解决方案6】:
            isRelative(url){
                return (/^(\.){1,2}(\/){1,2}$/.test(url.slice(0,3)) ||
                /(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)); 
            }
        

        尽管没有节点路径模块 API,但可以轻松检查路径是否是相对的。

        (/^(\.|~){1,2}(\/){1,2}$/.test(url.slice(0,3))
        

        这部分检查路径字符串是否以“./”或“../”或“~/”开头。 如果是,则返回布尔值 true。否则执行下一个测试。

        /(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)
        

        这只是检查路径字符串是否包含“/./”或“/../”。并在任何情况下都返回 true,在任何情况下都不返回 false。

        如果两个测试中的任何一个为真,则路径字符串是相对的。

        对于窗户。

            isRelative(url){
                return (/^(\.){1,2}(\\){1,2}$/.test(url.slice(0,3)) ||
                /(\\){1,2}(\.){1,2}(\\){1,2}/.test(url)); 
            }
        

        【讨论】:

        • 请解释你做了什么。
        • 如何定义以~ 开头的路径为相对路径?它们可能是相对的,但与当前目录无关。似乎真的有三种状态,isAbsolute 是一个糟糕的功能,因为它会误导。以~ 开头的路径是稳定的,不会因当前目录而改变;从这个意义上说,它们是绝对的……
        猜你喜欢
        • 2011-11-25
        • 2011-10-16
        • 2015-11-13
        • 2019-09-09
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 2012-08-24
        • 2013-12-10
        相关资源
        最近更新 更多