如何检查路径是绝对路径还是相对路径
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
是一个糟糕的功能,因为它会误导。以~
开头的路径是稳定的,不会因当前目录而改变;从这个意义上说,它们是绝对的……以上是关于如何检查路径是绝对路径还是相对路径的主要内容,如果未能解决你的问题,请参考以下文章
SEO 和 301 重定向 - 它们可以有相对路径还是必须是绝对路径?