Nodejs基础路径处理模块path总结.docx
《Nodejs基础路径处理模块path总结.docx》由会员分享,可在线阅读,更多相关《Nodejs基础路径处理模块path总结.docx(9页珍藏版)》请在冰豆网上搜索。
![Nodejs基础路径处理模块path总结.docx](https://file1.bdocx.com/fileroot1/2022-10/7/f207c6c9-26af-4a49-849d-1380fe36cac5/f207c6c9-26af-4a49-849d-1380fe36cac51.gif)
Nodejs基础:
路径处理模块path总结
在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。
部分因为文档说的不够清晰,部分因为接口的平台差异性。
作者:
程序猿小卡_casper来源:
segmentfault|2016-11-1420:
28
收藏
分享
模块概览
在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。
部分因为文档说的不够清晰,部分因为接口的平台差异性。
将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了。
获取路径/文件名/扩展名
·获取路径:
path.dirname(filepath)
·获取文件名:
path.basename(filepath)
·获取扩展名:
path.extname(filepath)
获取所在路径
例子如下:
1.var path = require('path');
2.var filepath = '/tmp/demo/js/test.js';
3.
4.// 输出:
/tmp/demo/js
5.console.log( path.dirname(filepath) );
获取文件名
严格意义上来说,path.basename(filepath)只是输出路径的最后一部分,并不会判断是否文件名。
但大部分时候,我们可以用它来作为简易的“获取文件名“的方法。
1.var path = require('path');
2.
3.// 输出:
test.js
4.console.log( path.basename('/tmp/demo/js/test.js') );
5.
6.// 输出:
test
7.console.log( path.basename('/tmp/demo/js/test/') );
8.
9.// 输出:
test
10.console.log( path.basename('/tmp/demo/js/test') );
如果只想获取文件名,单不包括文件扩展呢?
可以用上第二个参数。
1.// 输出:
test
2.console.log( path.basename('/tmp/demo/js/test.js', '.js') );
获取文件扩展名
简单的例子如下:
1.var path = require('path');
2.var filepath = '/tmp/demo/js/test.js';
3.
4.// 输出:
.js
5.console.log( path.extname(filepath) );
更详细的规则是如下:
(假设path.basename(filepath)===B)
·从B的最后一个.开始截取,直到最后一个字符。
·如果B中不存在.,或者B的第一个字符就是.,那么返回空字符串。
直接看官方文档的例子
1.path.extname('index.html')
2.// returns '.html'
3.
4.path.extname('index.coffee.md')
5.// returns '.md'
6.
7.path.extname('index.')
8.// returns '.'
9.
10.path.extname('index')
11.// returns ''
12.
13.path.extname('.index')
14.// returns ''
路径组合
·path.join([...paths])
·path.resolve([...paths])
path.join([...paths])
把paths拼起来,然后再normalize一下。
这句话反正我自己看着也是莫名其妙,可以参考下面的伪代码定义。
例子如下:
1.var path = require('path');
2.
3.// 输出 '/foo/bar/baz/asdf'
4.path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
path定义的伪代码如下:
1.module.exports.join = function(){
2. var paths = Array.prototye.slice.call(arguments, 0);
3. return this.normalize( paths.join('/') );
4.};
path.resolve([...paths])
这个接口的说明有点啰嗦。
你可以想象现在你在shell下面,从左到右运行一遍cdpath命令,最终获取的绝对路径/文件名,就是这个接口所返回的结果了。
比如path.resolve('/foo/bar','./baz')可以看成下面命令的结果
1.cd /foo/bar
2.cd ./baz
更多对比例子如下:
1.var path = require('path');
2.
3.// 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
4.
5.// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
6.console.log( path.resolve('') )
7.
8.// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
9.console.log( path.resolve('.') )
10.
11.// 输出 /foo/bar/baz
12.console.log( path.resolve('/foo/bar', './baz') );
13.
14.// 输出 /foo/bar/baz
15.console.log( path.resolve('/foo/bar', './baz/') );
16.
17.// 输出 /tmp/file
18.console.log( path.resolve('/foo/bar', '/tmp/file/') );
19.
20.// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
21.console.log( path.resolve('www', 'js/upload', '../mod.js') );
路径解析
path.parse(path)
path.normalize(filepath)
从官方文档的描述来看,path.normalize(filepath)应该是比较简单的一个API,不过用起来总是觉得没底。
为什么呢?
API说明过于简略了,包括如下:
·如果路径为空,返回.,相当于当前的工作路径。
·将对路径中重复的路径分隔符(比如linux下的/)合并为一个。
·对路径中的.、..进行处理。
(类似于shell里的cd..)
·如果路径最后有/,那么保留该/。
感觉stackoverflow上一个兄弟对这个API的解释更实在,原文链接。
Inotherwords,path.normalizeis"WhatistheshortestpathIcantakethatwilltakemetothesameplaceastheinput"
代码示例如下。
建议读者把代码拷贝出来运行下,看下实际效果。
1.var path = require('path');
2.var filepath = '/tmp/demo/js/test.js';
3.
4.var index = 0;
5.
6.var compare = function(desc, callback){
7. console.log('[用例%d]:
%s', ++index, desc);
8. callback();
9. console.log('\n');
10.};
11.
12.compare('路径为空', function(){
13. // 输出 .
14. console.log( path.normalize('') );
15.});
16.
17.compare('路径结尾是否带/', function(){
18. // 输出 /tmp/demo/js/upload
19. console.log( path.normalize('/tmp/demo/js/upload') );
20.
21. // /tmp/demo/js/upload/
22. console.log( path.normalize('/tmp/demo/js/upload/') );
23.});
24.
25.compare('重复的/', function(){
26. // 输出 /tmp/demo/js
27. console.log( path.normalize('/tmp/demo//js') );
28.});
29.
30.compare('路径带..', function(){
31. // 输出 /tmp/demo/js
32. console.log( path.normalize('/tmp/demo/js/upload/..') );
33.});
34.
35.compare('相对路径', function(){
36. // 输出 demo/js/upload/
37. console.log( path.normalize('./demo/js/upload/') );
38.
39. // 输出 demo/js/upload/
40. console.log( path.normalize('demo/js/upload/') );
41.});
42.
43.compare('不常用边界', function(){
44. // 输出 ..
45. console.log( path.normalize('./..') );
46.
47. // 输出 ..
48. console.log( path.normalize('..') );
49.
50. // 输出 ../
51. console.log( path.normalize('../') );
52.
53. // 输出 /
54. console.log( path.normalize('/../') );
55.
56. // 输出 /