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 系统上,输出:'\\'
相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax