Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查路径是绝对路径还是相对路径_Javascript_Node.js_Path_Directory_Absolute - Fatal编程技术网

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

Javascript 如何检查路径是绝对路径还是相对路径,javascript,node.js,path,directory,absolute,Javascript,Node.js,Path,Directory,Absolute,UNIX绝对路径以“/”开头,而Windows以字母“C:”或“\”开头。node.js是否有标准的多平台函数来检查路径是绝对路径还是相对路径?您可以使用 path.resolve(yourPath)===yourPath 如果路径未规范化,请使用 path.resolve( yourPath ) == path.normalize( yourPath ) 我不知道node.js,但您可以在github中看到path.js的源代码: 你可以看到: // windows version ex

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

您可以使用

path.resolve(yourPath)===yourPath
如果路径未规范化,请使用

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

我不知道node.js,但您可以在github中看到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;
};
以及:


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

正确的解决方案是:

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

正如注释中所建议的,这仍然存在一些问题,因为
path.resolve
会删除尾部斜杠,而
path.normalize
不会

我不确定这些函数到底是如何运行的(正如您在注释中所看到的),无论如何,以下代码段至少在Linux环境中运行良好:

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

由于节点版本为0.12.0,您可以使用模块中的功能

i、 e:


这是一个有点复杂的问题,但这是我发现的仅使用(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

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

对于windows

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

源代码中还有一个isAbsolute函数,即使我在文档中找不到它,而且它似乎不可用:是的,我不知道为什么文档中没有,但现在我想我会使用您的响应,为了安全。该函数实际上不稳定(0.11)但不在最后一个稳定中。如果
yourPath
尚未规范化(例如:它不适用于
///a///../b//
。相应的解决方案是:
path.resolve(yourPath)==path.normalize(yourPath)
这个答案有点模棱两可。这个检查证明了什么?但是由于
normalize
保留了尾部斜杠,您的解决方案需要增强。
path.resolve(\u yourPath)==path.normalize(\u yourPath.replace(/[\/\124;\\]$/,“”)
,将可靠地工作。@Marcdiehelm:你说得很对,我从来没有注意到。我将根据你的建议尝试修复答案!无论如何,你的解决方案仍然不能完美地工作,例如它在
'/\\\'
中失败。是否有任何特定的原因删除尾部反斜杠?它是支持windows路径还是其他?exac在Windows上需要仔细检查尾部的反斜杠。re:它会以“/\\”失败。我不明白,你能用elobarate吗?这应该是你测试的路径吗?@marcdethelm:是的,没错。我在Linux机器上运行Node。如果我将
“/\\”
字符串,
路径.resolve(“/\\”)传递给你的函数
返回
'/\'
,而
path.normalize('/\\').replace(/[\/\\]$/,'')
返回
'/'/'
。我在这个响应中添加的行在Linux上似乎可以正常工作,但可能是其他问题(可能在Windows上?)路径
'/\\'
对我来说似乎是一个真正的边缘案例。也许可以先尝试取消跳过?我不喜欢调用带有所有开销的RegExp构造函数。
path.sep
一开始看起来不错。但基本上我们只想删除任何一个(窗口或其他)比较前使用斜杠。这是我的修订版本,它也适用于根路径:
path.resolve(yourPath)==path.normalize(yourPath)。替换(/(.+)([\/\\])$/,“$1”)
。请注意,对于任何以/(在Windows或Mac上)开头的路径,isAbsolute似乎都返回true(不确定*nix)正如Alexander Mills指出的,这个答案是错误的。如果您的相对路径以
/
开头(就像所有相对路径通常所做的那样)然后这个方法将返回true,这是错误的。我不知道为什么它被选为正确答案,这是危险的,并且使它变得如此不可靠。@SproutCoder这个答案是正确的。也许你在考虑http URL意义上的相对路径?Node.js实用工具
path.isAbsolute
用于文件系统路径,其中“绝对路径”根据定义,以斜杠开头。例如,请参见。请注意,在unix或类似unix的系统上,当传递以
~
开头的路径时,这些路径将返回
false
。虽然这些路径确实与当前用户的用户目录相关,但它们与当前目录无关,因此更改目录s不会影响它们的解析结果。从这个意义上说,这些路径是绝对的,这可能会让一些人感到惊讶。请解释您所做的操作。如何将以
~
开头的路径定义为相对路径?它们可能是相对的,但与当前目录无关。看起来确实有三种状态,
isAbsolute
是一种状态错误的函数,因为它会误导用户。以
~
开头的路径是稳定的,不会因当前目录而改变;从这个意义上说,它们是绝对的。。。
/(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)
    isRelative(url){
        return (/^(\.){1,2}(\\){1,2}$/.test(url.slice(0,3)) ||
        /(\\){1,2}(\.){1,2}(\\){1,2}/.test(url)); 
    }