如何检查路径是绝对路径还是相对路径

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 是一个糟糕的功能,因为它会误导。以~ 开头的路径是稳定的,不会因当前目录而改变;从这个意义上说,它们是绝对的……

以上是关于如何检查路径是绝对路径还是相对路径的主要内容,如果未能解决你的问题,请参考以下文章

确定shell程序中的相对路径还是绝对路径

检测路径是绝对的还是相对的

SEO 和 301 重定向 - 它们可以有相对路径还是必须是绝对路径?

HTML中如何设置超链接相对路径

相对路径、绝对路径分别是啥? 要怎样才能学好数据结构这门课?

html文件上如何设置上下文相对路径?