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提供了win32posix各自对应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

原文地址:https://www.cnblogs.com/fly_dragon/p/8715438.html

时间: 2024-08-12 14:02:50

Node入门教程(8)第六章:path 模块详解的相关文章

ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Desktop的组成部分之一,ArcMap用于数据的浏览.编辑.显示.查询.地图排版等.ArcMap和ArcCatalog一起构成了完整的数据处理与管理分析的功能.在前一章中已经介绍了ArcCatalog的使用,本章中将介绍ArcMap的使用.本章的例子依然使用第4章里的小区平面图示例,但是将从原理的角度做更加

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

Android基础入门教程——2.5.2 Notification(状态栏通知)详解

Android基础入门教程--2.5.2 Notification(状态栏通知)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中用于在状态栏显示通知信息的控件:Notification,相信大部分 学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而 现在普遍的Android设备基本都在4.x以上,甚至是5.0以上的都有:他们各自的Notification 都是不一样的!而本节给大家讲解的是基于4.x以

Node入门教程(6)第五章:node 模块化(上)模块化演进

node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不冲突.但是到了大一点的项目,各种组件,各种第三方插件和各种 js 脚步融合的时候,就会发现这些技巧远远不够. 模块化的演变 为什么要有 JS 模块化呢?在浏览器中,顶层作用域的变量是全局的,所以项目稍微复杂点,如果引用的 js 非常多的时候,很容易造成命名冲突,然后造成很大意想不到的结果. 为了避免

Golang入门教程(十三)延迟函数defer详解

前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 基本介绍 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用

Node入门教程(1)目录

aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 如果您没有js的基础,建议您先学一下老马的前端免费视频教程 table list 第一章:NodeJS 概述 第二章:NodeJS 安装 第三章:NodeJs 第一个程序 第四章:global 全局变量 第五章:node 模块化(上)模块化演进 第五章:node 模块化(下)npm与yarn详解

ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 GIS的六大功能是数据获取.存储.查询.分析.表达.输出.在前面的内容里已经介绍了使用ArcGIS进行数据获取.存储.查询.表达和输出的过程,本章将介绍如何在ArcGIS中进行地理分析.分析是GIS的核心和灵魂,是GIS区别于一般的信息系统.CAD或者电子地图系统的主要标志之一. GIS分析,就是研究

ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区 1 软件安装 1.1 安装前准备 请确认已经收到来自Esri中国(北京)有限公司发出的软件安装光盘及包含许可授权文件(*.prvs或 *.prvc)的电子邮件. *.prvs是浮动版的许可,*.prvc是单机版的许可.下面以浮动版许可为例,介绍软件的安装. 在安装之前,请先确认待安装软件的系统.硬件及软件环境,是否满足ArcGIS for Desktop 10.4

ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区 1 ArcCatalog使用 1.1 GIS数据 地理信息系统,就是将真实的地物或地理现象抽象为计算机可表达的简单的集合类型(比如点.线.多边形),再按其几何类型和专题信息进行分类,通过计算机技术来管理和分析这些数据.从数据的组织形式上,我们通常将其分为矢量数据和栅格数据两大类. 如上图所示,分别用矢量和栅格的形式来表达一条高速公路.我们可以清晰地发现矢量数据与