如何检查path是绝对的还是相对的
UNIX绝对path以'/'开始,而Windows则以字母'C:'或'\'开头。 node.js有一个标准的多平台function来检查path是绝对的还是相对的?
这有点晚,但对于其他人在同一个问题上search:
从节点版本0.12.0开始,可以使用path模块中的path.isAbsolute(path)
函数。
即:
var path = require('path'); if(path.isAbsolute(myPath)) { //... }
正如dystroy的答案所评论的那样,如果绝对path还没有被标准化(例如path: ///a//..//b//./
),那么所提出的解决scheme就不起作用。
正确的解决scheme是:
path.resolve(yourPath) === path.normalize(yourPath)
正如Marc Diethelm在评论中所build议的那样,这仍然存在一些问题,因为path.resolve
会删除尾部的斜线,而path.normalize
则不会。
我不确定这些函数的行为如何(正如你可以在注释中看到的那样),无论如何下面的代码片段似乎至less在Linux环境中工作正常:
path.resolve(yourPath) === path.normalize(yourPath).replace( RegExp(path.sep+'$'), '' );
你可以使用
path.resolve(yourPath)===yourPath
如果你的path没有正常化,请使用
path.resolve( yourPath ) == path.normalize( yourPath )
这有点复杂,但是我发现使用(pre节点0.12.0)path模块的最稳健的方法
function isAbsolute(p) { return path.normalize(p + '/') === path.normalize(path.resolve(p) + '/'); }
需要注意的是,path.isAbsolute从节点0.12.0开始存在。
我不知道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) === '/'; };
isRelative(url){ return (/^(\.){1,2}(\/){1,2}$/.test(url.slice(0,3)) || /(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)); }
这样可以很容易地检查path是否相对,尽pipe没有节点path模块API。
(/^(\.|~){1,2}(\/){1,2}$/.test(url.slice(0,3))
这部分检查pathstring是否以“./”或“../”或“〜/”开头。 如果是,则返回布尔值true。 否则,执行下一个testing。
/(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)
这只是检查pathstring是否有“/./”或“/../”。 并在任何情况下返回true,在两者都不为false
如果两个testing中的任何一个是真的,那么pathstring是相对的。
对于窗户。
isRelative(url){ return (/^(\.){1,2}(\\){1,2}$/.test(url.slice(0,3)) || /(\\){1,2}(\.){1,2}(\\){1,2}/.test(url)); }