node基础模块常用api(一) -- path模块api

使用path模块需要导入,const path = require('path')

一、获取路径/文件名/文件扩展名

  • 获取路径:path.dirname(fpath)
  • 获取文件名: path.basename(fpath)
  • 获取文件扩展名: path.extname(fpath)
  • 获取文件所在文件夹绝对路径:__dirname
  • 获取文件所在绝对路径: __filename

获取路径

可以理解为,获取的是最后一个斜杠前面的部分

ini 复制代码
const path = require('path')
const fpath = '/aaa/bbb/ccc.js'

// 输出:/aaa/bbb
console.log( path.dirname(fpath) );

获取文件名

可以理解为,获取的是最后一个斜杠后面的部分

javascript 复制代码
const path = require('path');

// 输出:ccc.js
console.log( path.basename('/aaa/bbb/ccc.js') );

// 输出:ccc.js.md
console.log( path.basename('/aaa/bbb/ccc.js.md') );

// 输出:ccc
console.log( path.basename('/aaa/bbb/ccc') );

可以传入第二个参数,来忽略后缀

arduino 复制代码
// 输出:ccc.js
console.log( path.basename('/aaa/bbb/ccc.js.md', '.md' ) );

// 输出:ccc.j
console.log( path.basename('/aaa/bbb/ccc.js.md', 's.md' ) );

获取文件扩展名

获取最后一个.后的所有内容,如果不存在.或者只有一个.并且是字符串第一个字符,则返回空字符串

arduino 复制代码
// 输出:.js
console.log( path.extname('/aaa/bbb/ccc.js') );

// 输出:.md
console.log( path.extname('/aaa/bbb/ccc.js.md') );

// 输出:.b
console.log( path.extname('.a.b') );

// 输出:
console.log( path.extname('.a') );

// 输出:
console.log( path.extname('/aaa') );

二、路径格式化

path.normalize(filepath)

这个api主要的功能,是为了去掉路径中重复的路径分隔符,具体有以下功能:

  1. 去掉重复的路径分隔符
  2. 模拟'.','..'功能
  3. 路径最后有/,那么保留该/
  4. 路径为空,返回.
less 复制代码
const path = require('path')

// 输出 '.'
console.log( path.normalize('') );

// 输出 /a/b/c
console.log( path.normalize('/a/b/c') );

// 输出 /a/b/c/
console.log( path.normalize('/a/b/c/') );

// 输出 /a/b/c
console.log( path.normalize('////a/////b//c') );

// 输出 /a/b/c
console.log( path.normalize('/a/b/c/d/..') );

// .与..

// 输出 ..
console.log( path.normalize('./..') );

// 输出 ..
console.log( path.normalize('..') );

// 输出 ../
console.log( path.normalize('../') );

// 输出 /
console.log( path.normalize('/../') );

// 输出 /
console.log( path.normalize('/..') );

三、路径拼接

path.join(...paths)

用路径分隔符把数组用的每一项拼接,再调用上面的normalize方法

javascript 复制代码
const path = require('path')

// 输出 a/b/c/d/e
console.log(path.join('/a', 'b', 'c/d', 'e'));

// 输出 a/c/d/e
console.log(path.join('/a', 'b', '../c/d', 'e'));

path.resolve(...paths)

把数组的每一项执行 cd path,就是最终的结果

javascript 复制代码
const path = require('path')

// 输出 当前所在目录的绝对路径
console.log( path.resolve('') )

// 输出 当前所在目录的绝对路径
console.log( path.resolve('.') )

// 输出 /a/b/c
console.log( path.resolve('/a/b', './c') );

// 输出 /c
console.log( path.resolve('/a/b', '/c') );

// 输出 当前所在目录的绝对路径/a/b/d
console.log( path.resolve('a', 'b/c', '../d') );

解释一下path.resolve('/a/b', './c')

  1. cd /a/b
  2. cd ./c
  3. 得到 /a/b/c

解释一下path.resolve('a', 'b/c', '../d')

  1. cd a,注意没有/,所以是在当前所在绝对路径中进入a
  2. cd b/c,进入b再进入c
  3. cd ../d, ../返回上一层,相当于b,再进入d
  4. 得到 绝对路径/a/b/d

四、路径分解/组合

path.format(pathObject)

将pathObject的root、dir、base、name、ext属性,按照一定的规则,组合成一个文件路径。

path.parse(filepath)

path.format()方法的反向操作,把路径分割为pathObject

什么是pathObject?

pathObject就是用root、dir、base、name、ext这几个属性代表字符串路径

看不同系统平台下对于pathObject的相互转换

css 复制代码
linux:/root/a/b/c.txt
{
    root: "/",
    dir: "/a/b",
    base: "c.txt",
    name: "c",
    ext: "txt"
}
vbnet 复制代码
windows: C:\a\b\c.txt
{
    root: "C:\",
    dir: "\a\b",
    base: "c.txt",
    name: "c",
    ext: "txt"
}

五、 获取相对路径

path.relative(from, to)

  • 官方点的解释:返回从form到to 的相对路径
  • 白话解释:从from到to,通过cd xxxxx可以直接到达,返回xxxxx

特殊情况

  • 如果from、to指向同个路径,那么,返回空字符串。
lua 复制代码
const path = require('path');

// 输出 "../..//f"
console.log( path.relative('/a/b/c/d', '/a/b/e/f') );  

// 输出 ""
console.log( path.relative('/a/b', '/a/b') );  

// ''代表当前所在目录的绝对路径
// 输出 ../../当前所在目录的绝对路径
console.log( path.relative('/a/b', '') );

// 输出 多个../直到回到根目录/a/b
console.log( path.relative('', '/a/b') );  

平台相关接口/属性

path.sep

路径分隔符。在linux上是/,在windows上是``

path.delimiter

path设置的分割符。linux上是:,windows上是;

path.posix

path相关属性、接口的linux实现

path.win32

path相关属性、接口的win32实现

相关推荐
Moshow郑锴3 小时前
Ansible 批量部署 Node.js 服务:ZIP 直解与共享目录分发两种方案对比
node.js·ansible
少年的范儿10 小时前
Windows 安装 Node.js 教程:nvm 版本管理 + pnpm 安装配置
windows·npm·node.js
peach10 小时前
同样是装依赖,为什么 npm 长成 node_modules,Maven 长成 .m2
npm·node.js·maven
FungLeo13 小时前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈
FungLeo1 天前
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
月夏2 天前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js
SEO_juper2 天前
Node.js 页面主题聚焦度检测:title 和正文各说各的,AI 也读不懂
开发语言·人工智能·node.js·seo·外贸独立站
SEO_juper2 天前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
king13598745502 天前
AI Agent 端云协同选型:Node.js 任务成本算例与权限检查清单(2027—2028 展望)
人工智能·ai·node.js·ai agent
居里先生7522 天前
PDF 批注到底存在文件的哪里?从 /Annots 讲到导出验证
node.js