Node.js中路径处理模块path详解


Posted in Javascript onNovember 14, 2016

前言

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

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

     获取路径:path.dirname(filepath)

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

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

获取所在路径

例子如下:

var path = require('path');
var filepath = '/tmp/demo/js/test.js';

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

获取文件名

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

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

var path = require('path');

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

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

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

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

// 输出:test
console.log( path.basename('/tmp/demo/js/test.js', '.js') );

获取文件扩展名

简单的例子如下:

var path = require('path');
var filepath = '/tmp/demo/js/test.js';

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

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

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

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

直接看官方文档的例子

path.extname('index.html')
// returns '.html'

path.extname('index.coffee.md')
// returns '.md'

path.extname('index.')
// returns '.'

path.extname('index')
// returns ''

path.extname('.index')
// returns ''

路径组合

path.join([...paths])
path.resolve([...paths])

path.join([...paths])

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

例子如下:

var path = require('path');

// 输出 '/foo/bar/baz/asdf'
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');

path定义的伪代码如下:

module.exports.join = function(){
 var paths = Array.prototye.slice.call(arguments, 0);
 return this.normalize( paths.join('/') );
};

path.resolve([...paths])

这个接口的说明有点??隆D憧梢韵胂笙衷谀阍?hell下面,从左到右运行一遍cd path命令,最终获取的绝对路径/文件名,就是这个接口所返回的结果了。

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

cd /foo/bar
cd ./baz

更多对比例子如下:

var path = require('path');

// 假设当前工作路径是 /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('') )

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

// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz') );

// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz/') );

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

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
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的解释更实在,原文链接。

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"

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

var path = require('path');
var filepath = '/tmp/demo/js/test.js';

var index = 0;

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

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

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

 // /tmp/demo/js/upload/
 console.log( path.normalize('/tmp/demo/js/upload/') );
});

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

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

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

 // 输出 demo/js/upload/
 console.log( path.normalize('demo/js/upload/') );
});

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

 // 输出 ..
 console.log( path.normalize('..') );

 // 输出 ../
 console.log( path.normalize('../') );

 // 输出 /
 console.log( path.normalize('/../') );
 
 // 输出 /
 console.log( path.normalize('/..') );
});

文件路径分解/组合

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)

然后是windows下

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

path.format(pathObject)

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

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

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

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

var path = require('path');

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

var p2 = path.format({
 dir: '/tmp', 
 name: 'hello',
 ext: '.js'
});
console.log( p2 ); // 输出 /tmp/hello.js

path.parse(filepath)

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

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

path.parse('/home/user/dir/file.txt')
// returns
// {
// root : "/",
// dir : "/home/user/dir",
// base : "file.txt",
// ext : ".txt",
// name : "file"
// }

获取相对路径

接口:path.relative(from, to)

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

边界:

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

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

上例子:

var path = require('path');

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

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

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

平台相关接口/属性

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

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

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

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

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

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

直接来例子更直观。

> path.win32.join('/tmp', 'fuck')
'\\tmp\\fuck'
> path.win32.sep
'\\'
> path.win32.join('\tmp', 'demo')
'\\tmp\\demo'
> path.win32.join('/tmp', 'demo')
'\\tmp\\demo'

path.delimiter

linux系统例子:

console.log(process.env.PATH)
// '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin'

process.env.PATH.split(path.delimiter)
// returns ['/usr/bin', '/bin', '/usr/sbin', '/sbin', '/usr/local/bin']

windows系统例子:

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

process.env.PATH.split(path.delimiter)
// returns ['C:\\Windows\\system32', 'C:\\Windows', 'C:\\Program Files\\node\\']

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js能有所帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript面向对象之体会[总结]
Nov 13 Javascript
关于javascript中的parseInt使用技巧
Sep 03 Javascript
javascript之通用简单的table选项卡实现(二)
May 09 Javascript
JavaScript继承方式实例
Oct 29 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
Aug 12 Javascript
JavaScript实现列表分页功能特效
May 15 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
Koa日志中间件封装开发详解
Mar 09 Javascript
如何实现一个简易版的vuex持久化工具
Sep 11 Javascript
Vue中实现回车键切换焦点的方法
Feb 19 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 #Javascript
JavaScript中setTimeout的那些事儿
Nov 14 #Javascript
jquery css实现邮箱自动补全
Nov 14 #Javascript
JS常用算法实现代码
Nov 14 #Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 #Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 #Javascript
JS实现的几个常用算法
Nov 12 #Javascript
You might like
php动态生成JavaScript代码
2009/03/09 PHP
PHP nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
PHP SOCKET编程详解
2015/05/22 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
如何签定毕业生就业协议书
2014/09/28 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
新生开学寄语大全
2015/05/28 职场文书
锦旗赠语
2015/06/23 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android