Node FS 模块

概念

  1. FS:File System 文件系统。
  2. fs 模块可以实现与硬盘的交互。例如文件的创建、删除、重命名、移动, 还有文件内容的写入、读取以及文件夹的相关操作。

写入文件

直接写入

  1. 导入 fs 模块

  2. 异步写入文件 fs.writeFile

    • fs.writeFile(file, data[, options], callback)
    • file 文件名(含目录,若目录或文件不存在,Node 会自动创建)。
    • data 写入内容
    • options 选项设置 可选
    • callback 回调函数
  3. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    const fs = require('fs');
    fs.writeFile('./abc.md', '### 我是 H3\n#### 我是 H4', e => {
    if (e) {
    console.log('服务异常:', e);
    return;
    }
    console.log('成功');
    })
  4. 同步写入 fs.writeFileSync (效率低)

    1
    2
    const fs = require('fs');
    fs.writeFileSync('./abc.md', '### 我是 H3\n#### 我是 H4');

追加写入

  1. API

    • 异步:appendFile
    • 同步:appendFileSync
  2. 语法

    1
    2
    fs.appendFile(file, data[, options], callback);
    fs.appendFileSync(file, data);
  3. 参数:与 writeFile 一样

流式写入

  1. API:

    • 创建写入流对象 ws:createWriteStream(path)
    • 写入内容:ws.write()
    • 关闭通道:ws.close()
  2. 优势

    • 适合写入一些大文件
    • 持续写入文件,例如录屏
  3. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    const fs = require('fs');
    const ws = fs.createWriteStream('./Hello.md');

    ws.write('# 一级标题\n');
    ws.write('## 二级标题\n');
    ws.write('### 三级标题');

    ws.close();

文件读取

直接读取

  1. API

    • 异步:readFile
    • 同步:readFileSync
  2. 语法

    1
    fs.readFile(文件路径[, 配置参数], 回调函数);
  3. 回调函数:两个形参,参数一是错误对象,没有错误则为 null;参数二是读取到的内容的 Buff 对象。

  4. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const fs = require('fs');

    fs.readFile('./Hello.md', (err, data) => {
    if (err) {
    console.log('读取失败');
    return ;
    }
    console.log(data.toString());
    })

流式读取

  1. API

    • 创建读取流对象 rs:fs.createReadStream(‘’)
    • 绑定事件:rs.on(‘事件名’, ‘回调函数’)
  2. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const fs = require('fs');
    const rs = fs.createReadStream('./img.jpg');

    // 绑定 data 事件,每次读取都会执行
    rs.on('data', e => {
    console.log(e); // 64kb Buffer 对象
    })

    // 绑定 end 事件,读取结束后执行
    rs.on('end', ()=> {
    console.log('读取完成');
    })

复制文件

直接复制

1
2
3
4
const fs = require('fs');

let data = fs.readFileSync('./img.jpg'); // 读取
fs.writeFileSync('./img_copy.jpg', data); // 写入

流式复制 1

1
2
3
4
5
6
7
8
9
10
11
const fs = require('fs');
const rs = fs.createReadStream('./img.jpg'); // 读取流对象
const ws = fs.createWriteStream('./img_copy.jpg'); // 写入流对象

rs.on('data', e => {
ws.write(e);
});

rs.on('end', () => {
ws.close();
})

流式复制 2

1
2
3
4
5
const fs = require('fs');
const rs = fs.createReadStream('./img.jpg'); // 读取流对象
const ws = fs.createWriteStream('./img_copy.jpg'); // 写入流对象

rs.pipe(ws);

区别

流式省内存,大文件优选流式。

重命名与移动

  1. API

    • 异步:fs.rename
    • 同步:fs.renameSync
  2. 语法

    1
    fs.rename('旧路径', '新路径', 回调函数)
  3. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const fs = require('fs');

    fs.rename('./Hello.md', './Abc.md', e => {
    if (e) {
    console.log('操作失败');
    return ;
    }
    console.log('操作成功');
    });
  4. 说明

    • 若新路径与旧路径在同一目录时表示重命名,反之表示移动。
    • 若移动,必须保证新路径对应的目录是存在的。

文件删除

  1. API

    • 异步:fs.unlink / fs.rm
    • 同步:fs.unlinkSync / fs.rmSync
  2. 语法

    1
    2
    fs.unlink('文件路径', 回调函数)
    fs.rm('文件路径', 回调函数)
  3. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const fs = require('fs');

    fs.rm('./Hello.md', e => {
    if (e) {
    console.log('删除失败');
    return ;
    }
    console.log('删除成功');
    })

文件夹操作

创建文件夹

  1. API

    • 异步:fs.mkdir
    • 同步:fs.mkdirSync
  2. 语法

    1
    fs.mkdir('目录'[, '配置参数'], 回调函数)
  3. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    const fs = require('fs');

    // 创建单个目录
    fs.mkdir('./file', e => {
    if (e) {
    console.log('创建失败');
    return ;
    }
    console.log('创建成功');
    });

    // 创建多级目录(递归)
    fs.mkdir('./file/img', { recursive: true }, e => {
    if (e) {
    console.log('创建失败');
    return ;
    }
    console.log('创建成功');
    });

读取文件夹

  1. API

    • 异步:fs.readdir
    • 同步:fs.readdirSync
  2. 语法

    1
    fs.readdir('目录', 回调函数);
  3. 回调函数:

    • 形参一:错误对象
    • 形参二:资源列表
  4. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const fs = require('fs');

    fs.readdir('./', (err, data) => {
    if (err) {
    console.log('读取失败');
    return ;
    }
    console.log(data); // 打印结果 [ 'file', 'index.js' ]
    });

删除文件夹

  1. API

    • fs.rmdir 即将废弃
    • fs.rm 推荐使用
  2. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    const fs = require('fs');

    fs.rm('./file', { recursive: true } , e => {
    if (e) {
    console.log('删除失败');
    return ;
    }
    console.log('删除成功');
    });

查看文件/文件夹信息

  1. API

    • 异步:fs.stat
    • 同步:fs.statSync
  2. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const fs = require('fs');

    fs.stat('./Hello.md', (err, data) => {
    if (err) {
    console.log('操作失败');
    return ;
    }
    console.log(data); // 文件信息
    console.log(data.isFile()); // 是否为文件
    console.log(data.isDirectory());// 是否为目录
    })

__dirname

  1. __dirname 类似于一个全局变量。
  2. __dirname 中存放的是当前文件所在目录绝对路径。