node中Path的使用
posix标准
- path模块在不同操作系统是有差异的(
windows
|posix
)
posix是什么?
- posix是可移植的操作系统接口,它定义了一套标准,遵守这个标准的系统(
unix
,Linux
,IOS
,Andriod
....)
windows只遵守了部分posix标准
-
为什么要定义这套标准,
- 如:Linux系统启动一个进程需要调用
fork
函数在window启动进程需要调用creatprocess
函数 这样就会有问题,比如我在Linux写好的代码,需要移植到windows函数不统一,posix就需要解决这个
- 如:Linux系统启动一个进程需要调用
Windows为什么只遵守部分posix
-
在windows中路径使用反斜杠表示(
\
) 而遵守posix标准的系统则采用的是正斜杠表示(/
),windows为什么没有遵守这个规则是因为历史原因导致-
Windows的主要市场是个人和企业用户,这些用户群体的需求主要集中在图形用户界面、办公自动化、媒体播放和游戏等方面。POSIX则更多地被教育、研究、服务器和科学计算等领域所使用。因此Windows对POSIX支持的需求并不是特别强烈,微软也更倾向于开发和完善自家的API和服务来满足其主要市场的需求。
-
可以查看这个链接:windows10 为什么不把POSIX完整支持了
-
path的基本使用
path.basename
-
path.basename
方法返回给定路径 最后的一部分 -
如果是posix 标准的系统 处理windows路径
-
posix是不认识windows路径,会直接返回传入的参数
console.log(path.basename('C:\temp\myfile.html')) // C:\temp\myfile.html
- 如果是在posix标准去处理windows路径需要使用
path.win32
去处理windows路径
console.log(path.win32.basename('C:\temp\myfile.html')) // myfile.html
path.dirname
-
path.dirname
跟path.basename
刚好相反,它是返回给定路径除最后一部分
,其他全部返回console.log(path.win32.basename('C:\temp\myfile.html')) // C:\temp
path.extname
-
path.extname
方法返回的是给定路径最后一部分的扩展名- /aaa/1.html.js.cc 这样路径它返回
.cc
console.log(path.win32.extname('C:\temp\myfile.html')) // .html console.log(path.win32.extname('C:\temp\myfile.html.cc.js')) // .js
- /aaa/1.html.js.cc 这样路径它返回
path.join
-
path.join
这个方法主要拼接路径的// window: \foo\bar\abc // posix: /foo/bar/abc console.log(path.join('/foo','/bar','abc'))
-
可以支持
../
和./
操作符console.log(path.join('/foo','/bar','abc','../')) // /foo/bar console.log(path.join('/foo','/bar','abc','../','./')) // /foo/bar/ console.log(path.join('/foo','/bar','abc','../','./abc')) // /foo/bar/abc
path.resolve
-
path.resolve
方法将路径或路径片段的序列解析为绝对路径 -
如果在处理完所有给定的
path
片段之后,还没有生成绝对路径,则使用当前工作目录。 -
如果传入了多个绝对路径,它将返回最右边绝对路径
path.resolve('/aaa','/bbb','/ccc') // /ccc path.resolve('/foo', '/bar', 'baz') // /bar/baz
-
如果只传入相对路径
// 如果当前工作目录是 D:/home/myself/node, path.resolve('./ccc') // D:/home/myself/nod/ccc
-
传入绝对路径 + 相对路径
// 如果当前工作目录是 D:/home/myself/node, path.resolve(__dirname,'./index.js') // D:/home/myself/node/index.js
-
注意:
path.resolve
方法 是从右向左处理路径片段,如果找到一个绝对路径,在这个过程会忽略前面的路径
-
比如 '/aaa','/bbb','/ccc'
path.resolve('/aaa','/bbb','/ccc') // /ccc
- 从右往左找到绝对路径直接忽略前面的路径 索引就剩下 /ccc
-
比如:'wwwroot', '/static_files/png/', '../gif/image.gif'
path.resolve('wwwroot', '/static_files/png/', '../gif/image.gif')
-
path.resolve
这个方法会从右到左解析 -
首先于遇到了
../gif/image.gif
路径 他会把他解析成gif/image.gif
因为../
表示上级目录 -
然后遇到
/static_files/png/
因为他是绝对路径 直接忽略 前面路径 ,又因为 有一个上级目录
/static_files/png/
png路径就没有了,png后面/
因为没有文件名直接被忽略- 最后合并效果就是
/static_files/gif/image.gif
-
-
path.parse
-
path.parse
这个方法接收字符作为输入,返回一个包含路径组成部分的对象path.parse('/home/user/dir/file.txt') { root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' }
root
:路径的根目录,/
dir
: 文件所在目录 即:/home/user/dir
base
: 文件名+扩展名,即:file.txt
ext
: 文件扩展名,即:.txt
name
文件名, 即:file
path.format
-
path.format
这个方法接收一个对象 ,转回字符串 返回一个URL, 刚好与path.parse相反
const data = { root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' } const url = path.format(data) // /home/user/dir/file.txt