Node第十一章(path的使用)

132 阅读3分钟

node中Path的使用

posix标准

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

posix是什么?

  • posix是可移植的操作系统接口,它定义了一套标准,遵守这个标准的系统(unix,Linux,IOS,Andriod....)

windows只遵守了部分posix标准

  • 为什么要定义这套标准,

    • 如:Linux系统启动一个进程需要调用fork函数在window启动进程需要调用creatprocess 函数 这样就会有问题,比如我在Linux写好的代码,需要移植到windows函数不统一,posix就需要解决这个

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.dirnamepath.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
    

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