Nodejs 第十二章 path

path模块在不同的操作系统是有差异的(windows | posix)

POSIX(Portable Operating System Interface)是一系列IEEE标准,旨在促进和保证应用程序和操作系统之间的兼容性。POSIX定义了一套广泛的操作系统接口,包括但不限于系统调用、命令行工具和实用程序的规范。

POSIX的核心目标

  • 可移植性:使得软件可以在支持POSIX标准的任何操作系统上编写一次,到处运行。
  • 兼容性:通过标准化操作系统的接口,减少不同系统之间的差异。
  • 互操作性:使不同系统上的应用程序能够相互通信和协作。

主要内容

  • 系统接口:定义了一组系统调用接口,包括文件操作、进程控制、线程和同步、内存管理等。
  • Shell和实用程序 :规定了标准Shell(sh)的行为和一组标准的命令行实用程序,如lsgrep等。
  • 程序编写:定义了C语言的编程接口,包括库函数和头文件。

POSIX的应用

  • Unix和类Unix系统:大多数基于Unix的系统(如Linux、macOS、BSD)都遵循或部分遵循POSIX标准。
  • 嵌入式系统:一些嵌入式操作系统也实现了POSIX标准的子集,以利于移植和开发。
  • 跨平台编程:遵循POSIX标准可以提高代码在不同操作系统间的可移植性。

Windows 和 POSIX 路径的差异

  • Windows
    • 路径分隔符是反斜杠(\),例如 C:\Users\Example\file.txt,这是一个历史原因导致不完全遵守POSIX标准
    • 文件路径可以是相对的也可以是绝对的,绝对路径通常以盘符开头。
    • 不区分大小写,C:\Usersc:\users 被认为是相同的路径。
  • POSIX
    • 在 UNIX、Linux、macOS(基于UNIX)等系统中遵循 POSIX 标准。
    • 路径分隔符是正斜杠(/),例如 /home/example/file.txt
    • 文件路径同样可以是相对的或绝对的,绝对路径以根目录 / 开头。
    • 区分大小写,/home/Users/home/users 被认为是不同的路径。
js 复制代码
const path = require('path');

// 使用 Windows 风格的路径处理
const windowsPath = path.win32.join('C:\\', 'Users', 'Example', 'file.txt');

// 使用 POSIX 风格的路径处理
const posixPath = path.posix.join('/home', 'example', 'file.txt');

Path用法

  • Node.js 中的 path 模块提供了一系列实用工具,用于处理文件和目录的路径。这个模块可以帮助我们构造、解析和转换路径字符串。由于不同操作系统中文件路径的表示方式可能不同(如Windows使用反斜杠\,而POSIX(Unix、Linux、macOS等)系统使用斜杠/),path模块封装了这些差异,使路径操作在不同平台上更加一致。

path.basename

  • path.basename(path[, ext]) :返回 path(给定路径) 的最后一部分,可以通过 ext 参数去除文件扩展名。
    • 如果你仔细看,会发现我们下面采用的是POSIX标准,但在windows也可以使用(兼容了正反斜杠的写法),这正如前面所说的,path模块封装了这些差异,使路径操作在不同平台上更加一致
js 复制代码
const path = require('path');

console.log(path.basename('/foo/bar/baz/asdf/quux.html'));; // 返回: 'quux.html'
console.log(path.basename('\\foo\\bar\\baz\\asdf\\quux.html'));;//一样 返回: 'quux.html',其中\需要写两个是因为需要进行转义(Windows写法,POSIX处理不了)

console.log(path.basename('/foo/bar/baz/asdf/quux.html', '.html'));; // 返回: 'quux'

path.dirname

  • path.dirname(path) :返回 path 的目录部分,类似于 Unix 中的 dirname 和node中的__dirname命令。跟上面的basename就刚好反过来了
js 复制代码
const path = require('path');

console.log(path.dirname('/foo/bar/baz/asdf/quux.html'));; // 返回: '/foo/bar/baz/asdf'
console.log(path.dirname('\\foo\\bar\\baz\\asdf\\quux.html'));;//返回'\foo\bar\baz\asdf'

ath.extname

  • path.extname(path) :返回 path 的扩展名,从最后一个.到字符串结束。如果没有.path基本名称以.开始,则返回空字符串。
    • 通常可以用来判断当前文件是什么个东西(是图片还是个视频或者是一个js文件?)
js 复制代码
const path = require('path');

console.log("1",path.extname('index.html'));; // 返回: '.html'
console.log("2",path.extname('index.coffee.md'));; // 返回: '.md'
console.log("3",path.extname('index.'));; // 返回: '.'
console.log("4",path.extname('index'));; // 返回: ''
console.log("5",path.extname('.index'));; // 返回: ''

path.join

  • path.join([...paths]) :将所有给定的 paths 片段连接在一起,然后规范化生成的路径(拼接路径 )。处理平台特定的分隔符,如POSIX上的/和Windows上的\
js 复制代码
const joinedPath = path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// POSIX: '/foo/bar/baz/asdf'
// Windows: '\\foo\\bar\\baz\\asdf'
console.log(joinedPath);
//如果你疑惑为什么结果会没有quux这个内容,那是因为最后还有一个..,这个join拼接是支持回退的
//如果是../,返回的结果就会是\foo\bar\baz\asdf\,最后面多一个斜杠

path.resolve

  • path.resolve([...paths]):将路径或路径片段的序列解析为绝对路径。给定的路径序列从右至左被处理,直到构造出绝对路径为止。如果在处理所有给定的路径片段后还未能生成绝对路径,则会使用当前工作目录。
  • 如果都是绝对路径,就返回最后一个
  • 如果只有一个相对路径,返回当前工作的绝对路径
  • 相对路径+绝对路径(典型的__dirname和当前文件拼接),返回的还是绝对路径
js 复制代码
const path = require('path');

// 示例 1: 基本用法
console.log(path.resolve('/foo/bar', './baz'));
// 输出: '/foo/bar/baz'
// 解释: 从'/foo/bar'开始,'./baz'相对于'/foo/bar'解析为'/foo/bar/baz'

// 示例 2: 使用 '..' 导航到父目录
console.log(path.resolve('/foo/bar', './baz', '../qux'));
// 输出: '/foo/bar/qux'
// 解释: 从'/foo/bar'开始,'./baz'解析为'/foo/bar/baz',然后'../qux'将路径移动到父目录'/foo/bar',并附加'qux'

// 示例 3: 当路径为空时,默认为当前工作目录
console.log(path.resolve());
// 输出: 当前工作目录的绝对路径
// 解释: 由于没有提供路径,path.resolve将返回当前工作目录的绝对路径

// 示例 4: 当最后一个参数是绝对路径时
console.log(path.resolve('/foo/bar', '/tmp/file/'));
// 输出: '/tmp/file'
// 解释: '/tmp/file/'是绝对路径,因此path.resolve立即返回它

// 示例 5: 当路径片段是相对路径时
console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));
// 输出: 如果当前工作目录为'/home/myself/node',则返回'/home/myself/node/wwwroot/static_files/gif/image.gif'
// 解释: 从当前工作目录开始,依次解析'wwwroot', 'static_files/png/', '../gif/image.gif'为绝对路径

// 示例 6: 结合Windows盘符使用(在Windows环境下)
console.log(path.resolve('C:\\path\\to\\file\\', '..\\img\\picture.png'));
// 输出: 'C:\path\to\img\picture.png'
// 解释: 从'C:\path\to\file\'开始,'..\\img\\picture.png'相对于'C:\path\to\file\'解析为'C:\path\to\img\picture.png'

// 示例 7: 使用多个相对路径片段
console.log(path.resolve('tmp', 'local', '..', 'uploads'));
// 输出: 如果当前工作目录为'/home/user/project',则返回'/home/user/project/tmp/uploads'
// 解释: 从当前工作目录开始,依次解析'tmp', 'local', '..', 'uploads'为绝对路径

// 示例 8: 没有找到绝对路径时使用当前工作目录
console.log(path.resolve('myapp', 'views'));
// 输出: 如果当前工作目录为'/home/user/project',则返回'/home/user/project/myapp/views'
// 解释: 由于'myapp/views'是相对路径,path.resolve将其与当前工作目录结合,形成绝对路径

path.parse

  • path.parse(path) :将 path 字符串解析成一个对象,包含 dirrootbasenameext 等属性。
js 复制代码
const path = require('path');

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

path.format

  • path.format(pathObject) :从一个对象返回路径字符串,是 path.parse 的逆操作。
    • 我们把从parse中解析成对象的再丢进format中试试
    • 这里有一个点要注意,我们的路径用posix的/,而不是window的\。所以需要在path这个API后面加上posix(强制使用特定风格的路径分隔符)。如果不加就会默认当前系统的习惯(比如我是Windows系统,就会变成path.win32.format()),结果就会是/home/user/dir\file.txt这样的路径不统一
js 复制代码
const path = require('path');

console.log(path.posix.format(
  {
    root: '/',//根目录
    dir: '/home/user/dir',//文件所在目录
    base: 'file.txt',//文件名+后缀名
    ext: '.txt',//文件扩展名(后缀名)
    name: 'file'//文件名
  }
))
// 返回/home/user/dir/file.txt

path.sep

  • path.sep 用于提供平台特定的路径分隔符
js 复制代码
const path = require('path');

// 输出路径分隔符
console.log(path.sep); 
// 在 POSIX 系统上,输出:'/'
// 在 Windows 系统上,输出:'\\'
相关推荐
m0_748249542 分钟前
前端:base64的作用
前端
html组态7 分钟前
web组态可视化编辑器
前端·物联网·编辑器·web组态·组态·组态软件
~央千澈~15 分钟前
如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈
前端·apache
m0_7482398327 分钟前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
时雨h31 分钟前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
Cachel wood1 小时前
Django REST framework (DRF)中的api_view和APIView权限控制
javascript·vue.js·后端·python·ui·django·前端框架
m0_748234081 小时前
Spring Boot教程之三十一:入门 Web
前端·spring boot·后端
Domain-zhuo1 小时前
如何提高webpack的构建速度?
前端·webpack·前端框架·node.js·ecmascript
放逐者-保持本心,方可放逐1 小时前
SSE 流式场景应用 及 方案总结
javascript·axios·fetch·eventsource
还是大剑师兰特1 小时前
面试题:ES6模块与CommonJS模块有什么异同?
前端·es6·大剑师