【发布时间】:2014-03-09 01:33:48
【问题描述】:
UNIX 绝对路径以“/”开头,而 Windows 以字母“C:”或“\”开头。 node.js 是否有标准的多平台功能来检查路径是绝对路径还是相对路径?
【问题讨论】:
标签: javascript node.js path directory absolute
UNIX 绝对路径以“/”开头,而 Windows 以字母“C:”或“\”开头。 node.js 是否有标准的多平台功能来检查路径是绝对路径还是相对路径?
【问题讨论】:
标签: javascript node.js path directory absolute
你可以使用
path.resolve(yourPath)===yourPath
如果您的路径未标准化,请使用
path.resolve( yourPath ) == path.normalize( yourPath )
【讨论】:
yourPath 尚未标准化(例如:它不适用于///a//..//b//。正确的解决方案是:path.resolve( yourPath ) == path.normalize( yourPath )
我对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) === '/';
};
【讨论】:
正如对 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(/[\/|\\]$/, ''),将可靠地工作。
'/\\' 失败。是否有任何具体原因要删除尾随反斜杠?是支持windows路径还是其他什么?
'/\\' 字符串传递给您的函数,path.resolve('/\\') 返回'/\\',而path.normalize('/\\').replace(/[\/|\\]$/, '') 返回'/'。我添加到此响应中的行在 Linux 上似乎对我来说很好,但可能是其他问题(也许在 Windows 上?)
'/\\' 对我来说似乎是一个真正的边缘案例。也许先尝试取消转义?我不喜欢在这里调用 RegExp 构造函数及其所有开销。 path.sep 起初看起来不错。但基本上我们只想在比较之前删除任何(Windows 或其他)尾部斜杠。这是我的修改版本,也适用于根 '/' 路径:path.resolve(yourPath) === path.normalize(yourPath).replace(/(.+)([\/|\\])$/, '$1')。
从节点版本 0.12.0 开始,您可以使用 path 模块中的 path.isAbsolute(path) 函数。
即:
var path = require('path');
if(path.isAbsolute(myPath)) {
//...
}
【讨论】:
/ 开头(所有相对路径通常都这样做),那么此方法将返回 true,这是错误的。我不知道为什么它被选为正确答案,这很危险,而且很不可靠。
path.isAbsolute 旨在用于文件系统路径,其中定义的“绝对路径”以斜杠开头。例如,请参阅linfo.org/path.html。
isAbsolute,当在 unix 或类 unix 系统上传递以 ~ 开头的路径时,将返回 false。虽然这些路径确实相对于当前用户的用户目录,但它们与 current 目录无关,因此更改目录不会影响它们解析的内容。从这个意义上说,这些路径是绝对的,这可能会让一些人感到惊讶。
这有点令人费解,但我发现仅使用(pre node 0.12.0)路径模块的最可靠的方法
function isAbsolute(p) {
return path.normalize(p + '/') === path.normalize(path.resolve(p) + '/');
}
需要注意的是 path.isAbsolute 从节点 0.12.0 开始存在。
【讨论】:
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 是一个糟糕的功能,因为它会误导。以~ 开头的路径是稳定的,不会因当前目录而改变;从这个意义上说,它们是绝对的……