Skip to content

fs 文件系统模块

1.作用

fs(file system) 文件系统模块可以进行文件的创建、删除、重命名、移动, 文件内容的写入、读取, 以及文件夹的相关操作。

2.fs的异步和同步

fs 模块对文件的操作有异步和同步两种方式

区别:

  • 同步调用会阻塞代码的执行,异步不会
  • 异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调,效率高
  • 异常处理:同步必须要使用 try catch 方式,异步可以使用回调函数的第一个参数 err 【重要】
  • 语法方面:同步方法会比异步方法后面多上Sync,例如:readFile()readFileSync(),同步方法没有回调

3.文件的读取

在node中读取文件的方式有来两种,一个是利用fs模块,一个是利用流来读取。

  • 如果读取小文件,我们可以使用fs读取,fs读取文件的时候,是将文件一次性读取到本地内存。
  • 而如果读取一个大文件,一次性读取会占用大量内存,效率很低,这个时候需要用流来读取。

流是将数据分割段,一段一段的读取,可以控制速率,效率很高,不会占用太大的内存。gulp的task任务,文件压缩,和http中的请求和响应等功能的实现都是基于流来实现的。

3.1 readFile()

异步地读取一个文件的全部内容,文件的内容由回调函数中的data获取

js
fs.readFile(path[, options], callback)
  • path <string> | <Buffer> | <URL> | <integer> ,要读取文件的路径
  • options<Object> | <string>若不传参数,则读出的文件是buffer数据格式
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null>文件字符编码,一般传utf8,默认为null
      • flag<String>,参见 支持文件系统 flags,默认是r
      • signal<AbortSingal> 允许中止正在进行的读取文件
    • 当参数为String时,传入的为encoding
  • callback:读取完成后的回调,有两个参数
    • err:读取错误后的错误信息
    • data:读取成功后的文件内容

示例

index.js

js
//text.txt内容为:12345,上山打老虎

const fs = require('fs');
// 指定字符格式
fs.readFile('./text.txt','utf8',(err,data)=>{
    if(err){
        console.log(err);
    }else{
        console.log(data);  // 12345,上山打老虎
    }
})

// 不指定字符格式
fs.readFile('./text.txt',(err,data)=>{
    if(err){
        console.log(err);
    }else{
        console.log(data); 
        // <Buffer 31 32 33 34 35 2c e4 b8 8a e5 b1 b1 e6 89 93 e8 80 81 e8 99 8e>
    }
})

// 第二个参数为Object
fs.readFile(
    './text.txt',
    {
        encoding:'utf8',
        flag:'r'
    },
    (err,data)=>{
        if(err){
            console.log(err);
        }else{
            console.log(data); // 12345,上山打老虎
        }
    })

3.2 readFileSync()

同步地读取一个文件的全部内容,文件的内容由该函数的返回值获取

js
fs.readFileSync(path[, options])
  • path <string> | <Buffer> | <URL> | <integer> ,要读取文件的路径
  • options<Object> | <string>若不传参数,则读出的文件是buffer数据格式
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null>文件字符编码,一般传utf8,默认为null
      • flag<String>,参见 支持文件系统 flags,默认是r
      • signal<AbortSingal> 允许中止正在进行的读取文件
    • 当参数为String时,传入的为encoding

示例

js
// text.txt内容为:12345,上山打老虎
const fs = require('fs');
// 指定字符格式
const text=fs.readFileSync('./text.txt','utf8')
console.log(text); // 12345,上山打老虎

// 不指定字符格式
const text1=fs.readFileSync('./text.txt')
console.log(text1); 
// <Buffer 31 32 33 34 35 2c e4 b8 8a e5 b1 b1 e6 89 93 e8 80 81 e8 99 8e>

// 第二个参数为Object
const text2=fs.readFileSync('./text.txt',{
    encoding:'utf8',
    flag:'r'
})
console.log(text2); // 12345,上山打老虎

3.3 createReadStream()

  • 创建一个读取流对象,默认不会读取数据,可使用该对象上的方法读取文件的内容

默认创建一个流 是非流动模式,默认不会读取数据

js
fs.createReadStream(path[, options])
  • path<string> | <Buffer> | <URL>
  • options<string> | <Object>
    • flags<String>,参见 支持文件系统 flags,默认是r
    • encoding<string> | <null>,文件字符编码,一般传utf8,默认为null
    • fd<integer> | <FileHandle> ,默认值: null
    • mode<integer> ,默认值: 0o666
    • autoClose<boolean> ,读取完毕后是否自动关闭,默认值: true
    • emitClose<boolean>, 默认值: true
    • start<integer>,读取文件开始位置
    • end<integer> ,读取文件结束位置,默认值: Infinity
    • highWaterMark<integer> ,文件一次读多少字节,默认 64*1024
    • fs<Object> | <null> 默认值: null
    • signal: <AbortSignal> | <null> 默认值: null
  • 返回: <fs.ReadStream>

3.3.3 监听事件

常用的事件:

  • open -打开文件
  • data -当有数据可读时触发。
  • error -在读收和写入过程中发生错误时触发。
  • close -关闭文件
  • end - 没有更多的数据可读时触发

监听事件的语法:

  • 通过fs.createReadStream()返回的流对象的的on方法监听
js
const fs = require('fs');
const rs = fs.createReadStream('./text.txt',{});

rs.on("open",()=>{
   console.log("文件打开")
});

rs.on('data',(data)=>{
    console.log(data);
});

rs.on("err",()=>{
    console.log("发生错误")
});

rs.on('end',()=>{ //文件读取完毕后触发
    console.log("读取完毕");
});

rs.on("close",()=>{ //最后文件关闭触发
    console.log("关闭")
});

3.3.4 暂停和恢复

  • rs.pause() 暂停读取,会暂停data事件的触发,将流动模式转变非流动模式
  • rs.resume() 恢复data事件,继续读取,变为流动模式

3.3.5 示例

js
// txt内容为1235,上山打老虎
const fs = require("fs");
const rs = fs.createReadStream("./text.txt", {
    encoding: "utf8", //默认null
});
rs.on("open", () => {
    console.log("文件打开");
});
rs.on("data", (data) => {
    console.log(data);
});
rs.on("err", () => {
    console.log("发生错误");
});

rs.on("end", () => {
    //文件读取完毕后触发
    console.log("读取完毕");
});

rs.on("close", () => {
    //最后文件关闭触发
    console.log("关闭");
});
// 依次打印
/*
    文件打开
    12345,上山打老虎
    读取完毕
    关闭
*/

4.文件的写入

4.1 writeFile()

异步地写入数据到文件

  • 如果文件已存在,则替代文件。 data 可以是一个字符串或一个 buffer。
  • 如果文件不存在,则创建文件并写入内容
js
fs.writeFile(file, data[, options], callback)
  • file<string> | <Buffer> | <URL> | <integer> ,文件名或文件描述符
  • data<string> | <Buffer> | <Uint8Array>,向文件里写入的内容
    • 如果 data 是一个 buffer,则忽略 encoding 选项。它默认为 'utf8'
  • options<Object> | <string>,配置项
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null> ,文件的字符集,默认 = 'utf8'
      • mode<integer> 默认 = 0o666
      • flag<string> 默认为 'w'
    • 当参数为string时,传入的为encoding
  • callback<Function>
    • err<Error>

示例

js
const fs = require("fs");
fs.writeFile('text.txt', '你好', (err) => {
  if (err) throw err;
  console.log('文件写入成功');
});

4.2 writeFileSync()

向文件里同步写入内容,返回 undefined

  • 如果文件已存在,则替代文件。 data 可以是一个字符串或一个 buffer。
  • 如果文件不存在,则创建文件并写入内容
js
fs.writeFileSync(file, data[, options])
  • file<string> | <Buffer> | <URL> | <integer> 文件名或文件描述符
  • data<string> | <Buffer> | <Uint8Array>,向文件里写入的内容
  • options<Object> | <string>,配置项
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null> ,文件的字符集,默认 = 'utf8'
      • mode<integer> 默认 = 0o666
      • flag<string> 默认为'w'
    • 当参数为string时,传入的为encoding

示例

js
const fs = require("fs");
fs.writeFileSync('text.txt', '你好');

4.3 appendFile()

异步追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 Buffer

js
fs.appendFile(file, data[, options], callback)
  • file<string> | <Buffer> | <URL> | <integer> ,文件名或文件描述符
  • data<string> | <Buffer> | <Uint8Array>,向文件里写入的内容
    • 如果 data 是一个 buffer,则忽略 encoding 选项。它默认为 'utf8'
  • options<Object> | <string>,配置项
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null> ,文件的字符集,默认 = 'utf8'
      • mode<integer> 默认 = 0o666
      • flag<string> 默认为'a'
    • 当参数为string时,传入的为encoding
  • callback<Function>
    • err<Error>

示例

js
// text.txt内容为:12345
const fs = require("fs");

fs.appendFile('text.txt', ',上山打老虎','utf8',(err)=>{});

console.log(fs.readFileSync('text.txt'))   // 12345,上山打老虎

4.4 appendFileSync()

同步追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 Buffer

js
fs.appendFileSync(file, data[, options])
  • file<string> | <Buffer> | <URL> | <integer> ,文件名或文件描述符
  • data<string> | <Buffer> | <Uint8Array>,向文件里写入的内容
    • 如果 data 是一个 buffer,则忽略 encoding 选项。它默认为 'utf8'
  • options<Object> | <string>,配置项
    • 当参数为Object时,有如下配置项
      • encoding<string> | <null> ,文件的字符集,默认 = 'utf8'
      • mode<integer> 默认 = 0o666
      • flag<string> 默认为'a'
    • 当参数为string时,传入的为encoding

示例

js
// text.txt内容为:12345
const fs = require("fs");

fs.appendFileSync('text.txt', ',上山打老虎','utf8',(err)=>{});

console.log(fs.readFileSync('text.txt'))   // 12345,上山打老虎

4.5 createWriteStream()

4.5.1 作用

4.5.2 语法

4.5.3 示例

5.文件重命名

5.1 rename()

js
fs.rename(oldPath, newPath, callback)

示例

5.2 renameSync()

js
fs.renameSync(oldPath, newPath)

示例

5.3 移动文件

6.操作文件夹

6.1 mkdir()

js
fs.mkdir(path[, mode], callback)

示例

6.2 mkdirSync()

js
fs.mkdirSync(path[, mode])

示例

6.3 readdir()

js
fs.readdir(path[, options], callback)

示例

6.4 readdirSync()

js
fs.readdirSync(path[, options])

示例

6.5 rmdir()

js
fs.rmdir(path, callback)

示例

6.6 rmdirSync()

js
fs.rmdirSync(path)

示例

MIT Licensed