Rumah > hujung hadapan web > tutorial js > Node.js中路径处理模块path的介绍

Node.js中路径处理模块path的介绍

不言
Lepaskan: 2018-06-30 10:07:02
asal
1519 orang telah melayarinya

这篇文章主要介绍了关于Node.js中路径处理模块path的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

相信大家都知道在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。因为部分文档说的不够清晰,还有部分因为接口的平台差异性。本文就给大家详细介绍下关于Node.js中的路径处理模块path,希望能对大家学习或者使用模块path有所帮助,下面来一起看看吧。

前言

在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了。下面我们就来详细介绍下关于Node.js中的路径处理模块path。

获取路径/文件名/扩展名

     获取路径:path.dirname(filepath)<br>

     获取文件名:path.basename(filepath)<br>

     获取扩展名:path.extname(filepath)<br>

获取所在路径

例子如下:

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

// 输出:/tmp/demo/js
console.log( path.dirname(filepath) );
Salin selepas log masuk

获取文件名

严格意义上来说,path.basename(filepath) 只是输出路径的最后一部分,并不会判断是否文件名。

但大部分时候,我们可以用它来作为简易的“获取文件名“的方法。

var path = require(&#39;path&#39;);

// 输出:test.js
console.log( path.basename(&#39;/tmp/demo/js/test.js&#39;) );

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test/&#39;) );

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test&#39;) );
Salin selepas log masuk

如果只想获取文件名,单不包括文件扩展呢?可以用上第二个参数。

// 输出:test
console.log( path.basename(&#39;/tmp/demo/js/test.js&#39;, &#39;.js&#39;) );
Salin selepas log masuk

获取文件扩展名

简单的例子如下:

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

// 输出:.js
console.log( path.extname(filepath) );
Salin selepas log masuk

更详细的规则是如下:(假设 path.basename(filepath) === B

从B的最后一个.开始截取,直到最后一个字符。

如果B中不存在.,或者B的第一个字符就是.,那么返回空字符串。

直接看官方文档的例子

path.extname(&#39;index.html&#39;)
// returns &#39;.html&#39;

path.extname(&#39;index.coffee.md&#39;)
// returns &#39;.md&#39;

path.extname(&#39;index.&#39;)
// returns &#39;.&#39;

path.extname(&#39;index&#39;)
// returns &#39;&#39;

path.extname(&#39;.index&#39;)
// returns &#39;&#39;
Salin selepas log masuk

路径组合

path.join([...paths])
path.resolve([...paths])
Salin selepas log masuk

path.join([...paths])

把paths拼起来,然后再normalize一下。这句话反正我自己看着也是莫名其妙,可以参考下面的伪代码定义。

例子如下:

var path = require(&#39;path&#39;);

// 输出 &#39;/foo/bar/baz/asdf&#39;
path.join(&#39;/foo&#39;, &#39;bar&#39;, &#39;baz/asdf&#39;, &#39;quux&#39;, &#39;..&#39;);
Salin selepas log masuk

path定义的伪代码如下:

module.exports.join = function(){
 var paths = Array.prototye.slice.call(arguments, 0);
 return this.normalize( paths.join(&#39;/&#39;) );
};
Salin selepas log masuk

path.resolve([...paths])

这个接口的说明有点啰嗦。你可以想象现在你在shell下面,从左到右运行一遍cd path命令,最终获取的绝对路径/文件名,就是这个接口所返回的结果了。

比如 path.resolve(&#39;/foo/bar&#39;, &#39;./baz&#39;) 可以看成下面命令的结果

cd /foo/bar
cd ./baz
Salin selepas log masuk

更多对比例子如下:

var path = require(&#39;path&#39;);

// 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve(&#39;&#39;) )

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve(&#39;.&#39;) )

// 输出 /foo/bar/baz
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;./baz&#39;) );

// 输出 /foo/bar/baz
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;./baz/&#39;) );

// 输出 /tmp/file
console.log( path.resolve(&#39;/foo/bar&#39;, &#39;/tmp/file/&#39;) );

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
console.log( path.resolve(&#39;www&#39;, &#39;js/upload&#39;, &#39;../mod.js&#39;) );
Salin selepas log masuk

路径解析

path.parse(path)

path.normalize(filepath)

从官方文档的描述来看,path.normalize(filepath) 应该是比较简单的一个API,不过用起来总是觉得没底。

为什么呢?API说明过于简略了,包括如下:

如果路径为空,返回.,相当于当前的工作路径。

将对路径中重复的路径分隔符(比如linux下的/)合并为一个。

对路径中的.、..进行处理。(类似于shell里的cd ..)

如果路径最后有/,那么保留该/。

感觉stackoverflow上一个兄弟对这个API的解释更实在,原文链接。

In other words, path.normalize is "What is the shortest path I can take that will take me to the same place as the input"
Salin selepas log masuk

代码示例如下。建议读者把代码拷贝出来运行下,看下实际效果。

var path = require(&#39;path&#39;);
var filepath = &#39;/tmp/demo/js/test.js&#39;;

var index = 0;

var compare = function(desc, callback){
 console.log(&#39;[用例%d]:%s&#39;, ++index, desc);
 callback();
 console.log(&#39;\n&#39;);
};

compare(&#39;路径为空&#39;, function(){
 // 输出 .
 console.log( path.normalize(&#39;&#39;) );
});

compare(&#39;路径结尾是否带/&#39;, function(){
 // 输出 /tmp/demo/js/upload
 console.log( path.normalize(&#39;/tmp/demo/js/upload&#39;) );

 // /tmp/demo/js/upload/
 console.log( path.normalize(&#39;/tmp/demo/js/upload/&#39;) );
});

compare(&#39;重复的/&#39;, function(){
 // 输出 /tmp/demo/js
 console.log( path.normalize(&#39;/tmp/demo//js&#39;) );
});

compare(&#39;路径带..&#39;, function(){
 // 输出 /tmp/demo/js
 console.log( path.normalize(&#39;/tmp/demo/js/upload/..&#39;) );
});

compare(&#39;相对路径&#39;, function(){
 // 输出 demo/js/upload/
 console.log( path.normalize(&#39;./demo/js/upload/&#39;) );

 // 输出 demo/js/upload/
 console.log( path.normalize(&#39;demo/js/upload/&#39;) );
});

compare(&#39;不常用边界&#39;, function(){
 // 输出 ..
 console.log( path.normalize(&#39;./..&#39;) );

 // 输出 ..
 console.log( path.normalize(&#39;..&#39;) );

 // 输出 ../
 console.log( path.normalize(&#39;../&#39;) );

 // 输出 /
 console.log( path.normalize(&#39;/../&#39;) );
 
 // 输出 /
 console.log( path.normalize(&#39;/..&#39;) );
});
Salin selepas log masuk

文件路径分解/组合

path.format(pathObject) :将pathObject的root、dir、base、name、ext属性,按照一定的规则,组合成一个文件路径。

path.parse(filepath) path.format()方法的反向操作。

我们先来看看官网对相关属性的说明。

首先是linux下

┌─────────────────────┬────────────┐
│   dir  │ base │
├──────┬    ├──────┬─────┤
│ root │    │ name │ ext │
" / home/user/dir / file .txt "
└──────┴──────────────┴──────┴─────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)
Salin selepas log masuk

然后是windows下

┌─────────────────────┬────────────┐
│   dir  │ base │
├──────┬    ├──────┬─────┤
│ root │    │ name │ ext │
" C:\  path\dir \ file .txt "
└──────┴──────────────┴──────┴─────┘
(all spaces in the "" line should be ignored -- they are purely for formatting)
Salin selepas log masuk

path.format(pathObject)

阅读相关API文档说明后发现,path.format(pathObject)中,pathObject的配置属性是可以进一步精简的。

根据接口的描述来看,以下两者是等价的。

root vs dir:两者可以互相替换,区别在于,路径拼接时,root后不会自动加/,而dir会。

base vs name+ext:两者可以互相替换。

var path = require(&#39;path&#39;);

var p1 = path.format({
 root: &#39;/tmp/&#39;, 
 base: &#39;hello.js&#39;
});
console.log( p1 ); // 输出 /tmp/hello.js

var p2 = path.format({
 dir: &#39;/tmp&#39;, 
 name: &#39;hello&#39;,
 ext: &#39;.js&#39;
});
console.log( p2 ); // 输出 /tmp/hello.js
Salin selepas log masuk

path.parse(filepath)

path.format(pathObject) 的反向操作,直接上官网例子。

四个属性,对于使用者是挺便利的,不过path.format(pathObject) 中也是四个配置属性,就有点容易搞混。

path.parse(&#39;/home/user/dir/file.txt&#39;)
// returns
// {
// root : "/",
// dir : "/home/user/dir",
// base : "file.txt",
// ext : ".txt",
// name : "file"
// }
Salin selepas log masuk

获取相对路径

接口:path.relative(from, to)

描述:从from路径,到to路径的相对路径。

边界:

如果from、to指向同个路径,那么,返回空字符串。

如果from、to中任一者为空,那么,返回当前工作路径。

上例子:

var path = require(&#39;path&#39;);

var p1 = path.relative(&#39;/data/orandea/test/aaa&#39;, &#39;/data/orandea/impl/bbb&#39;);
console.log(p1); // 输出 "../../impl/bbb"

var p2 = path.relative(&#39;/data/demo&#39;, &#39;/data/demo&#39;);
console.log(p2); // 输出 ""

var p3 = path.relative(&#39;/data/demo&#39;, &#39;&#39;);
console.log(p3); // 输出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"
Salin selepas log masuk

平台相关接口/属性

以下属性、接口,都跟平台的具体实现相关。也就是说,同样的属性、接口,在不同平台上的表现不同。

path.posix:path相关属性、接口的linux实现。

path.win32:path相关属性、接口的win32实现。

path.sep:路径分隔符。在linux上是/,在windows上是``。

path.delimiter:path设置的分割符。linux上是:,windows上是;。

注意,当使用 path.win32 相关接口时,参数同样可以使用/做分隔符,但接口返回值的分割符只会是``。

直接来例子更直观。

> path.win32.join(&#39;/tmp&#39;, &#39;fuck&#39;)
&#39;\\tmp\\fuck&#39;
> path.win32.sep
&#39;\\&#39;
> path.win32.join(&#39;\tmp&#39;, &#39;demo&#39;)
&#39;\\tmp\\demo&#39;
> path.win32.join(&#39;/tmp&#39;, &#39;demo&#39;)
&#39;\\tmp\\demo&#39;
Salin selepas log masuk

path.delimiter

linux系统例子:

console.log(process.env.PATH)
// &#39;/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin&#39;

process.env.PATH.split(path.delimiter)
// returns [&#39;/usr/bin&#39;, &#39;/bin&#39;, &#39;/usr/sbin&#39;, &#39;/sbin&#39;, &#39;/usr/local/bin&#39;]
Salin selepas log masuk

windows系统例子:

console.log(process.env.PATH)
// &#39;C:\Windows\system32;C:\Windows;C:\Program Files\node\&#39;

process.env.PATH.split(path.delimiter)
// returns [&#39;C:\\Windows\\system32&#39;, &#39;C:\\Windows&#39;, &#39;C:\\Program Files\\node\\&#39;]
Salin selepas log masuk

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Vuex管理登录的状态解析

关于vue解决跨域路由冲突问题的思路

Atas ialah kandungan terperinci Node.js中路径处理模块path的介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Isu terkini
node.js - node -v akses ditolak
daripada 1970-01-01 08:00:00
0
0
0
Bolehkah hos pelayan Node aplikasi React?
daripada 1970-01-01 08:00:00
0
0
0
Penggunaan berbilang pemuat dalam Node
daripada 1970-01-01 08:00:00
0
0
0
javascript - Kisah antara Node, commonJs dan vue
daripada 1970-01-01 08:00:00
0
0
0
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan