前端---【Node.JS的fs(文件系统)操作模块】

目录

一. nodeJS fs模块介绍

二. fs文件系统的操作

2.1 文件写入

2.2文件写入方法                 

2.2.1 writeFile 异步写入

2.2.2 writeFileSync 同步写入

2.2.3 appendFile / appendFileSync  追加写入

2.2.4 createWriteStream 流式写入

2.2.5 写入文件的场景

2.3 文件读取

2.3.1异步读取

2.3.2 同步读取

2.3.3 流式读取

2.3.4 读取文件应用场景

2.4 文件重命名与移动

 2.4.1文件重命名

 2.4.2 文件移动

2.5文件删除

2.6文件夹操作

2.6.1创建一个新的文件夹

2.6.2读取文件夹

三. 路径

3.1相对路径

3.2绝对路径

3.3 __dirname


一. nodeJS fs模块介绍

概念解释:fs 全称为 `file system`,称之为`文件系统`,是 Node.js 中的`内置模块`,可以对计算机中的磁盘进行操作。

本章节会介绍如下几个操作:

  • 1. 文件写入
  • 2. 文件读取
  • 3. 文件移动与重命名
  • 4. 文件删除
  • 5. 文件夹操作
  • 6. 查看资源状态

二. fs文件系统的操作

2.1 文件写入

文件写入就是将`数据`保存到`文件`中,我们可以使用如下几个方法来实现该效果

2.2文件写入方法                 

  •  writeFile                            异步写入 
  •  writeFileSync                    同步写入 
  • appendFile / appendFileSync  追加写入
  •  createWriteStream           流式写入 

2.2.1 writeFile 异步写入

语法:  fs.writeFile(file, data[, options], callback)

参数说明:

  • file  文件名
  • data 待写入的数据
  • options  选项设置可选
  • callback 写入回调

代码示例:

//1. 导入 fs 模块  require 需要
let fs = require('fs');

//2.1 调用方法写入文件 write 写  File 文件, 如果目标文件不存在, 会自动创建
// fs.writeFile('文件路径','写入的内容', '回调函数');               error  该回调函数会在写入完成后, 自动执行
fs.writeFile('/代码/iindex.html', '理性的人追求的并非快乐,而只是避免痛苦', err => {
  //判断
  if (err) {
    console.log('写入失败~~');
  } else {
    console.log('写入成功~~');
  }
});

第二种方式写入方式:绝对路径写入

//2.2 绝对路径
fs.writeFile('index2.html',
  '我如清心照明月,明月负我如梭哈', err => {
    //如果存在错误
    if (err) {
      console.log('写入失败');
      return;
    }
    console.log('写入成功');
  })

执行结果 由此看到 我们在文件写入的名字,就是生成新文件的名字.写入的结果在新文件里

新文件写入结果

2.2.2 writeFileSync 同步写入

语法:   fs.writeFileSync(file, data[, options])

代码

fs.writeFileSync('./index.html', '<h1>看看人间的苦难,听听人民的呐喊</h1>');

 Node.js 中的磁盘操作是由其他`线程`完成的,结果的处理有两种模式:
 

  • 同步处理   JavaScript 主线程`会等待`其他线程的执行结果,然后再继续执行主线程的代码,效率较低
  • 异步处理   JavaScript 主线程`不会等待`其他线程的执行结果,直接执行后续的主线程代码,效率较好

2.2.3 appendFile / appendFileSync  追加写入

appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同.

语法: 

  • fs.appendFile(file, data[, options], callback)
  • fs.appendFileSync(file, data[, options])

代码

// //1. 导入 fs 模块  require 需要
let fs = require('fs');
// 2.5 追加写入 appendFileSync
fs.appendFile('./index.html', '没有值不值得,只有愿不愿意\r\n', err => {
  if (err) throw err;
  console.log('写入成功');
});

运行截图

2.2.4 createWriteStream 流式写入

作用:程序打开一个文件是需要消耗资源的`,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于`大文件写入或者频繁写入`的场景, writeFile 适合于`写入频率较低的场景

语法:fs.createWriteStream(path[, options])

代码

//1. 导入 fs 模块
const fs = require('fs');

//2. 创建写入流对象   create 创建  write 写入    stream 流
const ws = fs.createWriteStream('./index.html');

//3. 调用对象的 write 方法完成写入
ws.write(' 你很好\r\n');
ws.write('漂亮\r\n');
ws.write('大方\r\n');
ws.write('热情\r\n');
ws.write('自立\r\n');

运行截图

 2.2.5 写入文件的场景

当需要持久化保存数据`的时候,应该想到`文件写入,文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入,

  1. 下载文件
  2.  安装软件
  3.  保存程序日志,如 Git
  4.  编辑器保存文件
  5.  视频录制

2.3 文件读取

文件读取顾名思义,就是通过程序从文件中取出其中的数据,

我们可以使用如下几种方式:

  • readFile         异步读取 
  • readFileSync     同步读取
  • createReadStream 流式读取 

2.3.1异步读取

read读file文件,语法:fs.readFile(path[, options], callback)

代码示范 这里读取是上文的index.html文件

//1. 导入 fs 模块
const fs = require('fs');

//调用方法  read 读 file 文件
//fs.readFile('文件路径', '回调函数');  // 回调函数会在文件读取完成后`自动执行`
fs.readFile('./index.html', (err, data) => {
    //判断
    if (err) throw err;
    //输出文件的内容
    console.log(data.toString());
});

运行截图

 2.3.2 同步读取

语法:fs.readFileSync(path[, options])

代码示范

//1. 导入 fs 模块
const fs = require('fs');
//2同步读取
let data = fs.readFileSync('./index.html');
console.log(data.toString());

  运行截图

2.3.3 流式读取

//读取 index.html 文件内容
//1. 导入
const fs = require('fs');

//2. 创建读取流对象
// const rs = fs.createReadStream('./index.html');
const rs = fs.createReadStream('../资料/笑看风云.mp4');

//3. 绑定事件  chunk 块儿 大块儿
rs.on('data', chunk => { // 取出一块儿数据之后, 会自动执行该回调函数
  // console.log(chunk);
  //输出取出 buffer 长度
  console.log(chunk.length);//65536 字节 => 64KB
});

//读取完成事件
rs.on('end', () => {
  console.log('读取完成');
});

2.3.4 读取文件应用场景

  •  电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git 查看日志
  • 上传文件
  • 查看聊天记录

2.4 文件重命名与移动

在 Node.js 中,我们可以使用 rename或 renameSync来移动或重命名`文件或文件夹

语法:

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

参数说明: 

* oldPath   文件当前的路径
* newPath  文件新的路径
* callback   操作后的回调

2.4.1文件重命名

代码示例:

//1. 导入 fs 模块
const fs = require('fs');

//2. 调用方法重命名     会在重命名结束之后,自动执行
//fs.rename('目标文件的路径', '重命名之后的路径', err => {});
fs.rename('./index.html', './观书有感.html', err => {
    if (err) throw err;
    console.log('操作成功');
})

未命名的图片 文件名称index.html

 执行后的代码

 2.4.2 文件移动

代码示列

//1. 导入 fs 模块
const fs = require('fs');
//2 移动文件
fs.rename('./观书有感.html', './project/观书有感.html', err => {
    if (err) throw err;
    console.log('移动成功');
});

2.5文件删除

//导入 fs 模块
const fs = require('fs');

//调用方法删除
fs.unlink('./project/观书有感.html', err => {
    if (err) throw err;
    console.log('删除成功~~');
});

2.6文件夹操作

2.6.1创建一个新的文件夹

fs.mkdir(path [, options], callback)

const fs = require('fs');

// 创建一个新的文件夹
fs.mkdir('./test', (err) => {
  if (err) throw err;
  console.log('文件夹创建成功');
});

2.6.2读取文件夹

  • fs.readdir(path [, options], callback):读取一个文件夹中的所有文件和子文件夹。

  • path:要读取的文件夹的路径。

  • options:一个可选的对象,用于指定读取文件夹的编码和排序方式等。

  • callback:一个回调函数,用于在读取完成后执行。

    const fs = require('fs');
    
    // 读取一个文件夹中的所有文件和子文件夹
    fs.readdir('./test', (err, files) => {
      if (err) throw err;
      console.log('文件夹中的文件和子文件夹:', files);
    });

2.6.3 删除文件夹

2.6.3.1删除空文件夹

fs.rmdir(path [, options], callback):删除一个空的文件夹。

  • path:要删除的文件夹的路径。
  • options:一个可选的对象,用于指定递归选项等。
  • callback:一个回调函数,用于在删除完成后执行。
    const fs = require('fs');
    
    // 删除一个空的文件夹
    fs.rmdir('./test', (err) => {
      if (err) throw err;
      console.log('文件夹删除成功');
    });

2.6.3.2 删除一个文件夹

fs.rm(path [, options], callback):删除一个文件夹或者文件。

  • path:要删除的文件夹或者文件的路径。
  • options:一个可选的对象,用于指定递归选项等。
  • callback:一个回调函数,用于在删除完成后执行。
    const fs = require('fs');
    
    // 删除一个文件夹或者文件
    fs.rm('./test', { recursive: true }, (err) => {
      if (err) throw err;
      console.log('文件夹或者文件删除成功');
    });

三. 路径

fs 模块对资源进行操作时,路径有多种写法

3.1相对路径

相对路径中所谓的`当前目录`,指的是`命令行的工作目录`,而并非是文件的所在目录

  ./座右铭.txt        当前目录下的座右铭.txt
  座右铭.txt          等效于上面的写法
  ../座右铭.txt       当前目录的上一级目录中的座右铭.txt

相对路径代码举例

const fs = require('fs');
const path = require('path');

// 获取当前文件所在的目录
const currentDir = path.dirname(__filename);

// 读取同一目录下的 index.html 文件
fs.readFile(path.join(currentDir, 'index.html'), 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

3.2绝对路径

是从文件系统的根目录开始指定文件或目录的路径

   D:/Program Files    windows 系统下的绝对路径
   /usr/bin                     Linux 系统下的绝对路径

绝对路径代码举例:

const fs = require('fs');

// 读取 /var/www/html/index.html 文件
fs.readFile('/var/www/html/index.html', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

3.3 __dirname

__dirname与 require 类似,都是 Node.js 环境中的'全局'变量

__dirname 保存着当前文件所在目录的绝对路径,可以使用 __dirname 与文件名拼接成绝对路径

代码示例:

let data = fs.readFileSync(__dirname + '/data.txt');
console.log(data);

dirname说明 使用fs模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的 Bug.