# 八.fs

前言

  • 在 NodeJS 中,使用 fs 模块来实现所有有关文件及目录的创建、写入及删除操作
  • 在 fs 模块中,所有的方法都分为同步和异步两种实现
  • 具有sync后缀的方法为同步方法,不具有sync后缀的方法为异步方法

# 1.读取文件

  • 异步读取

    fs.readFile(path[,options],callback)
    
    1
    • options
      • encoding
      • flag flag 默认 = 'r'
  • 同步读取

    fs.readFileSync(path[,options])
    
    1

# 2.写入文件

  • 异步写入

    fs.writeFile(file,data[,options],callback)
    
    1
    • options
      • encoding
      • flag flag 默认 = 'w'
      • mode 读写权限,默认为 0666
    let fs = require("fs")
    fs.writeFile("./1.txt", Date.now() + "\n", { flag: "a" }, function() {
      console.log("ok")
    })
    
    1
    2
    3
    4
  • 同步写入

    fs.writeFileSync(file,data[,options])
    
    1
  • 追加文件 fs.appendFile(file,data[,options],callback)

    fs.appendFile("./1.txt", Date.now() + "\n", function() {
      console.log("ok")
    })
    
    1
    2
    3
  • 拷贝文件

    function copy(src, target) {
      fs.readFile(src, function(err, data) {
        fs.writeFile(target, data)
      })
    }
    
    1
    2
    3
    4
    5

# 3.从指定位置开始读取文件

  • 打开文件 fs.open(filename,flags,[mode],callback);

    • FileDescriptor 是文件描述符
    • FileDescriptor 可以被用来表示文件
    • in -- 标准输入(键盘)的描述符
    • out -- 标准输出(屏幕)的描述符
    • err -- 标准错误输出(屏幕)的描述符
    fs.open("./1,txt", "r", 0600, function(err, fd) {})
    
    1
  • 读取文件 fs.read(fd, buffer, offset, length, position, callback((err, bytesRead, buffer)))

    const fs = require("fs")
    const path = require("path")
    fs.open(path.join(__dirname, "1.txt"), "r", 0o666, function(err, fd) {
      console.log(err)
      let buf = Buffer.alloc(6)
      fs.read(fd, buf, 0, 6, 3, function(err, bytesRead, buffer) {
        console.log(bytesRead) //6
        console.log(buffer === buf) //true
        console.log(buf.toString())
      })
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 写入文件 fs.write(fd, buffer[, offset[, length[, position]]], callback)

    const fs = require("fs")
    const path = require("path")
    fs.open(path.join(__dirname, "1.txt"), "w", 0o666, function(err, fd) {
      console.log(err)
      let buf = Buffer.from("好好学习")
      fs.write(fd, buf, 3, 6, 0, function(err, bytesWritten, buffer) {
        console.log(bytesWritten) //6
        console.log(buffer === buf) //true
        console.log(buf.toString()) //好好学习
      })
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 同步磁盘缓存

fs.fsync(fd,[callback])

  • 关闭文件

fs.close(fd,[callback])

let buf = Buffer.from("好好学习")
fs.open("./2.txt", "w", function(err, fd) {
  fs.write(fd, buf, 3, 6, 0, function(err, written, buffer) {
    console.log(written)
    fs.fsync(fd, function(err) {
      fs.close(fd, function(err) {
        console.log("写入完毕!")
      })
    })
  })
})
1
2
3
4
5
6
7
8
9
10
11
  • 拷贝文件
    let BUFFER_SIZE=1;
    const path=require('path');
    const fs=require('fs');
    function copy(src,dest,callback) {
        let buf=Buffer.alloc(BUFFER_SIZE);
        fs.open(src,'r',(err,readFd)=>{
            fs.open(dest,'w',(err,writeFd) => {
                !function read() {
                    fs.read(readFd,buf,0,BUFFER_SIZE,null,(err,bytesRead) => {
                        bytesRead&&fs.write(writeFd,buf,0,bytesRead,read);
                    });
                }()
            })
        });
    }
    copy(path.join(__dirname,'1.txt'),path.join(__dirname,'2.txt'),()=>console.log('ok'));
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

# 5.目录操作

# 6.递归创建目录

# 7.递归删除目录

# 8.遍历算法

# 9.path 模块

# 10.flags

# 11.助记

# 12.linux 权限