Node内置模块

内置模块path

  • 在mac linux window上的路径是不一样的
  • path模块可以屏蔽它们之间的差异。

从路径中获取信息

  • dirname:获取文件的父文件夹
  • basename:获取文件名
  • extname:获取文件扩展名

路径的拼接

  • path.join
    • 将多个路径进行拼接,但是不同的操作系统可能使用的是不同的分隔符
  • path.resolve
    • 如果是将某个文件和文件夹拼接,可以使用 path.resolve;
    • resolve会判断拼接的路径字符串中 是否有以/ ./或 ../开头的路径
    • 如果有表示是一个绝对路径,会返回对应的拼接路径
    • 如果没有,那么会和当前执行文件所在的文件夹进行路径的拼接

内置模块fs

fs是file system的缩写 表示文件系统

fs的API

https://nodejs.org/dist/latest-v14.x/docs/api/fs.html

大多数有三种操作方式:

  • 同步操作文件
  • 异步回调函数操作文件
  • 异步Promise操作文件

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const fs = require('fs')

//读取文件信息
const filepath = './a.txt'

//方式一:同步操作
// const info =fs.statSync(filepath)
// console.log(info);
// console.log('后续执行代码');

//方式二:异步操作
// fs.stat(filepath,(err,info)=>{
// if(err){
// console.log(err);
// return
// }
// console.log(info);
// })
// console.log('后续');

// 方式三:promise
fs.promises.stat(filepath).then(info=>{
console.log(info);
}).catch(err=>{
console.log(err);
})
console.log('后续执行');

文件描述符

  • 在 POSIX 系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源的表格。

  • 每个打开的文件都分配了一个称为文件描述符的简单的数字标识符。

  • 在系统层,所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。

  • fs.open() 方法用于分配新的文件描述符。

    • 一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。

    文件的读写

  • 如果要对文件的内容进行操作,这个时候可以使用文件的读写:

    • fs.readFile(path[, options], callback):读取文件的内容;
    • fs.writeFile(file, data[, options], callback):在文件中写入内容;
    • option参数:
      • flag:写入的方式。
        • w 打开文件写入,默认值;
        • w+打开文件进行读写,如果不存在则创建文件;
        • r+ 打开文件进行读写,如果不存在那么抛出异常;
        • r打开文件读取,读取时的默认值;
        • a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
        • a+打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
      • encoding 编码
        • UTF-8编码
  • 文件的读取

    • 如果不填写encoding,返回的结果是Buffer;
  • 文件夹的操作

    • 创建文件夹

      1
      2
      3
      4
      5
      6
      const dirname ='./hyp'
      if(!fs.existsSync(dirname)){
      fs.mkdir(dirname,error=>{
      console.log(error);
      })
      }
    • 读取文件夹中的文件

      1
      2
      3
      fs.readdir(dirname,(err,files)=>{
      console.log(files);
      })
      • 读取所有文件

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        function getFiles(dirname){
        fs.readdir(dirname,{withFileTypes:true},(err,files)=>{
        for(let file of files){
        if(file.isDirectory()){
        const filepath = path.resolve(dirname,file.name)
        getFiles(filepath)
        }
        else{
        console.log(file.name);
        }
        }
        })
        }
        getFiles(dirname)
    • 重命名

      1
      2
      3
      fs.rename('./hyp','./hyppp',err=>{
      console.log(err);
      })

events模块

  • Node中的核心API都是基于异步事件驱动的:

    • 在这个体系中,某些对象(发射器(Emitters))发出某一个事件;

    • 我们可以监听这个事件(监听器 Listeners),并且传入的回

      调函数,这个回调函数会在监听到事件时调用;

  • 发出函数和监听函数都是通过EventEmitter来完成 , 它们都属于events对象

    • emitter.on(eventName,listener) : 监听事件 也可以使用addListener
    • emitter.off(eventName,listener):移除事件监听,也可以使用removeListener
    • emitter.emit(eventName[,…args]):发出事件 可以携带一些参数

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //创建发射器
    const emitter = new EventEmitter()

    //监听事件
    //on
    //addListener
    emitter.on('click',(...args)=>{
    console.log('监听1到click',...args);
    })
    const listener2= (args)=>{
    console.log('监听2到click',args);
    }
    emitter.on('click',listener2)

    //发出事件
    setTimeout(() => {
    emitter.emit('click','hyo','hyp','zzz')
    emitter.off('click',listener2)
    emitter.emit('click','hyo','hyp','zzz')
    }, 2000);
  • 获取注册事件相关方法:

    1
    2
    3
    4
    //获取注册的事件
    console.log(emitter.eventNames());
    console.log(emitter.listenerCount('click'));
    console.log(emitter.listeners('click'));
  • 一些不常用方法

    • emitter.once(eventName, listener):事件监听一次
    • emitter.prependListener():将监听事件添加到最前面
    • emitter.prependOnceListener():将监听事件添加到最前面,但是只监听一次
    • emitter.removeAllListeners([eventName]):移除所有的监听器 ([eventName])可选参数