什么是fs(文件系统)

  • file system
  • 在Node中,与文件的交互是十分重要的,服务器的实质就是将本地的文件发送给近程的客户端
  • Node通过fs模块来和文件系统进行交互
  • 该模块提供了一些标准文件拜访API来关上,读取,写入文件,以及其余的交互
  • Node中应用fs模块,const fs = require('fs')

fs中的同步和异步

  • fs模块中的所有操作都有两种操作模式,即同步和异步
  • 同步文件系统会阻塞零碎的执行,也就是除非操作实现,否则代码不会往下继续执行了
  • 异步文件系统不会阻塞程序的执行,而是在操作实现是,通过回调函数将后果返回

fs的应用

文件写入

  • 手动操作的步骤

    1. 关上文件

      • 同步:fs.openSync(path[, flags[, mode]])

        • path:要关上的文件的门路
        • flags:关上文件要做的操作类型(上面会具体介绍有多一些操作类型)

          • r:只读的
          • w:可写的
          • a: 追加
        • mode:可选值,是设置文件的操作权限,个别不传
        • 该办法会返回一个文件的描述符作为后果,咱们能够通过该描述符来对文件进行各种操作
      • 异步:fs.open(path[, flags[, mode]], callback)

        • callback:两个返回参数

          • err:谬误对象,如果没有就是null
          • fa:文件的描述符
    2. 向文件中写入内容

      • 同步:fs.writeSync(fd, string[, position[, encoding]])

        • fd:文件的描述符,须要传递要写入的描述符
        • string:要写入的内容
        • position:个别不写,示意写入的起始地位
        • encoding:个别不写,示意编码,默认utf-8
      • 异步:fs.write(fd, string[, position[, encoding]], callback)
    3. 保留并敞开文件

      • fs.closeSync(fd)

        • fd:要敞开文件的描述符
      • fs.close(fd[, callback])
    // 同步写入文件const fs = require('fs')// 关上文件let fd = fs.openSync('demo.txt','w')// 写入文件fs.writeSync(fd, "仙剑奇侠传三")// 敞开文件fs.closeSync(fd)
    // 异步写入文件const fs = require('fs')// 关上文件fs.open('demo2.txt','w',function(err,fd) {    if(!err) {         // 写入文件        fs.write(fd,'恋情公寓',function(err) {            if(!err) {                console.log('写入胜利')            }            // 敞开文件            fs.close(fd,function(err) {                if(!err) {                    console.log('已保留并敞开文件')                }            })        })    }else{        console.log('出错了')    }})
  • 简略文件写入

    • 同步:fs.writeFileSync(file, data[, options])
    • 异步:fs.writev(fd, buffers[, position], callback)

      • file:要操作的文件的门路
      • data:要写入的数据
      • options:可选,能够对写入进行一些设置,是一个对象,有三个值

        • encoding:编码。默认 'utf8'
        • mode:文件权限。默认 0o666
        • flag:文件只读还是可写。默认 'w' (上面会具体介绍有多一些操作类型)
      • callback:当写入实现当前,执行

        // 简略文件写入const fs = require('fs')// 异步fs.writeFile('demo3.txt','景天和雪见',function(err) {if(!err){console.log('写入胜利')}})// 同步fs.writeFileSync('demo4.txt','紫萱和徐长卿')    
  • 流式文件写入

    • 同步,异步,简略文件写入都不适宜大文件写入,所以有了流式文件写入
    • 用法:创立一个可写流,fs.createWriteStream(path[, options])

      // 流式文件写入const fs = require('fs')// 创立一个可写流let ws = fs.createWriteStream('demo.txt')// 通过ws想文件中输入内容ws.write("通过可写流写入的内容")// 敞开流,不能用ws.close(),不然文件传不完ws.end()
  • flag: 文件操作类型有哪些

    • r:读取文件,文件不存在则出现异常
    • r+:读写文件,文件不存在则出现异常
    • rs:在同步模式下关上文件用于读取
    • rs+:在同步模式下关上文件用于读写
    • w:关上文件用于写操作,如果不存在则创立,如果存在则截断,截断即笼罩全副
    • wx:关上文件用于写操作,如果存在则关上失败
    • w+: 关上文件用于读写,如果不存在则创立,如果存在则截断
    • wx+:关上文件用于读写,如果存在则关上失败
    • a:关上文件用于追加,如果不存在则创立
    • ax:关上文件用于追加,如果门路存在则失败
    • a+:关上文件进行读取和最佳,如果不存在则创立
    • ax+:关上文件进行读取和追加,如果门路存在则失败

文件读取

  • 简略文件读取

    • 同步:fs.readFileSync(path[, options])
    • 异步:fs.readFile(path[, options], callback)

      • callback(err,data)

        • err:谬误对象
        • data:读取到的数据,是一个Buffer,为什么是Buffer呢?因为读取到的不肯定是字符串,可能是图片,音频等。Buffer的通用性更高。字符串的话能够用toString读取数据

          // 简略文件读取const fs = require('fs')fs.readFile('demo.txt',function(err,data) {if(!err) {console.log(data)console.log(data.toString())}})
  • 流式文件读取

    • 同样实用于大文件
    • 用法:fs.createReadStream(path[, options])

      // 流式读取文件const fs = require('fs')// 创立一个可读流let rs = fs.createReadStream('demo.txt')// 读取可读流中的数据,必须要可读流绑定一个data事件,data事件绑定结束,他会主动读取数据rs.on('data',function(data) {console.log(data)console.log(data.toString())})// 如果咱们想把读取到数据写到另一个文件当中let ws = fs.createWriteStream('demo1.txt')// 应用pipe(管道),会间接输出到ws中rs.pipe(ws)