Node入门教程(8)第六章:path 模块详解
path 模块详解
path
模块提供了一些工具函数,用于处理文件与目录的路径。由于windows和其他系统之间路径不统一,path
模块还专门做了相关处理,屏蔽了彼此之间的差异。
可移植操作系统接口(POSIX)
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。
微软的Windows NT声称部分实现了POSIX标准。
当前的POSIX主要分为四个部分:Base Definitions、System Interfaces、Shell and Utilities和Rationale。
综述:目前主流的类Unix操作系统:Unix、Linux都会兼容POSIX的标准,而Windows只是部分实行了POSIX标准,所以后面我们说POSIX系统是指类Unix系统
windows系统和类Unix系统的路径的区别
目录结构的区别
可能大家比较熟悉windows资源管理系统,windows是分不同的磁盘,然后磁盘下面都是树状结构的文件和文件夹。
而类Unix(Unix、Linux)系统中是不分盘符的,只有一个根目录 /
, 都是都是这个下面的子目录或者文件,当然也是树状的机构。
Linux的目录结构
[图片上传失败...(image-233704-1522805165775)];
路径的区别
除了目录结构有区别外,路径也是有区别的。windows是用反斜杠\
分割目录或者文件的,而在类Unix的系统中是用的/
。
windows的路径: C:\temp\myfile.html
类Unix的路径: /tmp/myfile.html
path模块获取路径中的文件名
语法:path.basename(path[, ext])
参数:
- path <string> 完整文件名路径
- ext <string> 可选的文件扩展名
- 返回: <string> 文件名
例如:
path.basename('/foo/bar/baz/asdf/quux.html');
// 返回: 'quux.html'
path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// 返回: 'quux'
注意:如果 path 不是一个字符串或提供了 ext 但不是一个字符串,则抛出 TypeError。
完整实例:
const path = require('path'); // 引入path模块
let linuxPath = '/Users/aicoder/abc.html';
let name = path.basename(linuxPath);
console.log(name);
let winPath = 'c:\\temp\\abc.html';
let winName = path.basename(linuxPath);
console.log(winName);
console.log(path.basename(linuxPath, '.html')); // => abc,去掉后缀输出文件名
// 输出结果
abc.html
abc.html
abc
node提供了win32和posix兼容的api
默认情况下,node会根据不同的系统做相关兼容处理,力保输出的结果在不同平台下是一致的,但是某些情况下还是不能完美的兼容所有的情况。所以,node提供了win32
和posix
各自对应path的所有的api。也就是说:path
模块的api都可以通过path.win32
或者 path.posix
调用。
要想在任何操作系统上处理 Windows 文件路径时获得一致的结果,可以使用 path.win32
path.win32.basename('C:\\temp\\myfile.html');
// 返回: 'myfile.html'
要想在任何操作系统上处理 POSIX 文件路径时获得一致的结果,可以使用 path.posix
path.posix.basename('/tmp/myfile.html');
// 返回: 'myfile.html'
其他api也是一致的,不再赘述。
获取路径的文件夹
path.dirname()
方法返回一个 path 的目录名。
语法: path.dirname(path)
参数:
path <string>
,要返回路径的变量- 返回:
<string>
path.dirname('/foo/bar/baz/asdf/quux');
// 返回: '/foo/bar/baz/asdf'
获取路径的扩展名
path.extname()
方法返回 path 的扩展名,即从 path 的最后一部分中的最后一个 .(句号)字符到字符串结束。
如果 path 的最后一部分没有 .
或 path 的文件名的第一个字符是 .
,则返回一个空字符串。
语法: path.extname(path)
- 参数:
path
是<string>
类型。 - 返回: <string>
path.extname('index.html');
// 返回: '.html'
path.extname('/etc/a/index.html');
// 返回: '.html'
path.extname('index.coffee.md');
// 返回: '.md'
path.extname('index.');
// 返回: '.'
path.extname('index');
// 返回: ''
path.extname('.index');
// 返回: ''
格式化一个路径
path.format()
方法会从一个对象返回一个路径字符串。
语法:path.format(pathObject)
- pathObject <Object> 要转换成路径字符串的设置对象
- dir <string> 所在目录,提供了 pathObject.dir,则 pathObject.root 会被忽略
- root <string> 根目录
- base <string> 文件全名。如果
pathObject.base
存在,则pathObject.ext
和pathObject.name
会被忽略 - name <string> 文件名字(不带后缀)
- ext <string> 文件后缀
- 返回: <string> 返回完整路径字符串
path.format({
dir: '/home/user/dir',
base: 'file.txt'
});
// 返回: '/home/user/dir/file.txt'
path.format({
root: '/',
name: 'file',
ext: '.txt'
});
// 返回: '/file.txt'
把路径字符串转换成对象
path.parse()
方法返回一个对象,对象的属性表示 path 的元素。
parse
方法跟 format
方法正好相反,所以不赘述。直接看例子:
let pathObj = path.parse('/users/home/aicoder/a.html');
console.dir(pathObj);
// 输出如下
{ root: '/',
dir: '/users/home/aicoder',
base: 'a.html',
ext: '.html',
name: 'a' }
连接多个路径重点
path.join()
方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。
长度为零的 path 片段会被忽略。 如果连接后的路径字符串是一个长度为零的字符串,则返回 '.',表示当前工作目录。
参数说明:...paths <string>
一个路径片段的序列。
返回: <string>
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'
path.join('/foot', __filename); // __filename是模块内的变量,代表当前js文件
// 返回:/foot/xxx.js
// 以下路径拼接的方式不推荐:
var strPath = '/foot/' + 'xxx.js'; //虽然跟上面实现的方式一致,但是不推荐。
注意:不推荐路径直接进行字符串拼接,毕竟win和POSIX系统路径有区别。
获取相对路径
path.relative() 方法返回从 from 到 to 的相对路径(基于当前工作目录)。
如果 from 和 to 各自解析到同一路径(调用 path.resolve()),则返回一个长度为零的字符串。
如果 from 或 to 传入了一个长度为零的字符串,则当前工作目录会被用于代替长度为零的字符串。
语法: path.relative(from, to)
参数:
- from <string> 求相对路径的原始路径。
- to <string> 求相对路径的最终路径。
- 返回: <string> 返回相对于from的 to的相对路径。
path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
// 返回: '../../impl/bbb'
智能解析绝对路径
path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径。
规则:
1. 给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。
2. 如果处理完全部给定的 path 片段后还未生成一个绝对路径,则当前工作目录会被用上。
3. 生成的路径是规范化后的,且末尾的斜杠会被删除,除非路径被解析为根目录。
4. 长度为零的 path 片段会被忽略。
5. 如果没有传入 path 片段,则 path.resolve() 会返回当前工作目录的绝对路径。
path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果当前工作目录为 /home/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
对路径字符串进行规范化
path.normalize() 方法会规范化给定的 path,并解析 '..' 和 '.' 片段。
当发现多个连续的路径分隔符时(如 POSIX 上的 / 与 Windows 上的 \ 或 /),它们会被单个的路径分隔符(POSIX 上是 /,Windows 上是 \)替换。 末尾的多个分隔符会被保留。
如果 path 是一个长度为零的字符串,则返回 '.',表示当前工作目录。
语法: path.normalize(path)
- path <string> 要进行规范的路径字符串
- 返回: <string> 规范后的路径字符串
path.normalize('/foo/bar//baz/asdf/quux/..');
// 返回: '/foo/bar/baz/asdf
// windows 上
path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// 返回: 'C:\\temp\\foo\\'
平台兼容的分隔符
路径片段分隔符:
Windows 上是 \
POSIX 上是 /
为了兼容不同平台,node提供了一个path的辅助属性path.sep
来兼容不同平台下的路径片段分隔符。
console.log(path.sep); // POSIX: / windows: \
// 在 POSIX 上:
'foo/bar/baz'.split(path.sep);
// 返回: ['foo', 'bar', 'baz']
//在 Windows 上:
'foo\\bar\\baz'.split(path.sep);
// 返回: ['foo', 'bar', 'baz']
路径分隔符
平台路径分隔符是不同的:Windows
上是 ;
POSIX
上是 :
node也做了兼容处理,提供了path.delimiter
来实现平台兼容。
例如,我们常见的path环境变量上做分割处理:
//在 POSIX 上:
console.log(process.env.PATH);
// 输出: '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin'
process.env.PATH.split(path.delimiter);
// 返回: ['/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);
// 返回: ['C:\\Windows\\system32', 'C:\\Windows', 'C:\\Program Files\\node\\']
判断是否是绝对路径
path.isAbsolute(path)
此方法接受一个字符串,返回boolean类型。
// POSIX
path.isAbsolute('/foo/bar'); // true
path.isAbsolute('qux/'); // false
// Windows
path.isAbsolute('C:\\foo\\..'); // true
path.isAbsolute('bar\\baz'); // false
总结
node的path模块使用非常简单,而且老马简单看了一下node的源码,写的非常精彩,对于多种情况的处理都很恰到好处,推荐大家看node的path模块源码: /lib/path.js。
github地址:https://github.com/malun666/aicoder_node
Node入门教程(8)第六章:path 模块详解的更多相关文章
- ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...
- “全栈2019”Java异常第十六章:Throwable详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- 转载的:Python os 和 os.path模块详解
os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdi ...
- Node入门教程(6)第五章:node 模块化(上)模块化演进
node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不 ...
- Node入门教程(5)第四章:global 全局变量
global - 全局变量 全局对象(global object),不要和 全局的对象( global objects )或称标准内置对象混淆.这里说的全局的对象是说在全局作用域里的内的对象.全局作用 ...
- python标准库介绍——2 os.path模块详解
== os.path 模块 == ``os.path`` 模块包含了各种处理长文件名(路径名)的函数. 先导入 (import) ``os`` 模块, 然后就可以以 ``os.path`` 访问该模块 ...
- Node入门教程(9)第七章:NodeJs的文件处理
Node的文件处理涉及到前面说的ptah模块,以及fs文件系统.stream流处理.Buffer缓冲器等模块.内容可能比较多,相关内容请以官网文档为主,此处主要以案例讲解为主,分享给大家一些常用的经典 ...
- Node入门教程(7)第五章:node 模块化(下) npm与yarn详解
Node的包管理器 JavaScript缺少包结构的定义,而CommonJS定义了一系列的规范.而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题. ...
随机推荐
- 关于pyinstaller打包程序时设置icon时的一个坑
关于pyinstaller打包程序时设置icon时的一个坑 之前在用pyinstaller打包程序的时候遇到了关于设置图标的一点小问题,无论在后面加--icon 或是-i都出现报错.查了下st ...
- hdu 5407【LCM性质】+【逆元】(结论题)
<题目链接> <转载于 >>> > Problem Description CRB has N different candies. He is going ...
- QT学习之第一个程序
QT学习之第一个程序 目录 手动创建主窗口 居中显示 添加窗口图标 显示提示文本 Message Box的应用 手动连接信号与槽 手动创建主窗口 窗口类型 QMainWindow: 可以包含菜单栏.工 ...
- 关于instanceof判断的条件
//instanceof是判断左侧对象是不是右侧类的实例 package myPackage; /** * instanceof运算符用法 * 运算符是双目运算符,左面的操作元是一个对 ...
- 用postcss cli运行postcss
一.验证autoprefixer插件1.新建项目 新建文件夹postcss: 在postcss目录中,新建package.json文件,新建css文件夹: 在css文件夹新建outfile.css,i ...
- 4889: [Tjoi2017]不勤劳的图书管理员 树套树
国际惯例的题面(Bzoj没有,洛谷找的):动态加权逆序对,一眼树套树.256MB内存,5e4范围,不虚不虚.首先把交换改成两个插入和两个删除.考虑插入和删除的贡献,就是统计前面比这个值大的数的数值和, ...
- angular.js创建自定义指令-demo3
html: <!doctype html><html ng-app="myModule"> <head> <meta charset=&q ...
- 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include <iostream> #include <string> #include <iomanip> using namespace std; #def ...
- MyEclipse设置文件的编码格式
在MyEclipse中复制properties文件的时候,发现一个问题,在EditPlus中打开文件中文可以正常显示,并且是UTF-8的编码格式. 但是将这个文件复制到MyEclipse中再打开时,中 ...
- Java access to the Domino Objects, Part 1
From: https://www.ibm.com/developerworks/lotus/library/ls-Java_access_pt1/index.html Overview Java a ...