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 this用法小结
Dec 19 Javascript
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
jQuery弹出(alert)select选择的值
Apr 21 Javascript
javascript中比较字符串是否相等的方法
Jul 23 Javascript
jquery实现的鼠标下拉滚动置顶效果
Jul 24 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
浅析BootStrap模态框的使用(经典)
Apr 29 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 Javascript
微信小程序实现图片选择并预览功能
Jul 25 Javascript
在 Vue 中编写 SVG 图标组件的方法
Feb 24 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
discuz目录文件资料汇总
2014/12/30 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
JS面向对象编程浅析
2011/08/28 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python实现多线程网页下载器
2018/04/15 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
品管员岗位职责
2013/11/10 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript