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

时间:2014-02-11 10:14:53

标签: javascript node.js path directory absolute

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

6 个答案:

答案 0 :(得分:25)

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

即:

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

答案 1 :(得分:9)

您可以使用

path.resolve(yourPath)===yourPath

如果您的路径未规范化,请使用

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

答案 2 :(得分:8)

如果对破坏的答案发表评论,如果绝对路径尚未规范化(例如路径:///a//..//b//./),则建议的解决方案不起作用。

正确的解决方案是:

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

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

我不确定这些函数的确如何表现(正如您在评论中所读到的那样),无论如何,以下代码段似乎至少在Linux环境中都能正常工作:

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

答案 3 :(得分:3)

这有点令人费解,但我使用(前节点0.12.0)路径模块找到的最强大的方法

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

应该注意,path.isAbsolute从节点0.12.0开始存在。

答案 4 :(得分:1)

我不知道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) === '/';
};

答案 5 :(得分: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)

这只是检查路径字符串是否有" /./"或" /../"。并且在any上返回true,在none上都返回false。

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

对于Windows。

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