Node.js——fs(文件系统)模块

个人简介

👀个人主页: 前端杂货铺

🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展

📃个人状态: 研发工程师,现效力于中国工业软件事业

🚀人生格言: 积跬步至千里,积小流成江海

🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 前言
    • [writeFile 文件写入](#writeFile 文件写入)
    • [appendFile 追加写入](#appendFile 追加写入)
    • [writeFile 追加写入](#writeFile 追加写入)
    • [createWriteStream 流式写入](#createWriteStream 流式写入)
    • [readFile 文件读取](#readFile 文件读取)
    • [createReadStream 流式读取](#createReadStream 流式读取)
    • 文件复制(同步)
    • 文件复制(流式)
    • [rename 文件重命名](#rename 文件重命名)
    • [unlink / rm 文件删除](#unlink / rm 文件删除)
    • 文件夹操作
    • [stat 查看资源信息](#stat 查看资源信息)
    • [__dirname & __filename](#__dirname & __filename)
    • 总结

前言

Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本。

我认为,作为一名前端开发人员,学习 Node.js 是非常有必要的!它可以充当服务端,补足前端程序员对服务端语言的欠缺。

本篇文章我们学习 Node.js 的 fs 模块(即文件系统模块)。


writeFile 文件写入

写入文件前要先导入 fs 模块,之后通过 writeFile 可以进行异步写入,通过 writeFileSync 可以进行同步写入。

writeFile 接口接收三个参数(从左到右依次为):

  • 要写入的文件名
  • 待写入的数据
  • 回调函数,处理 error 场景
javascript 复制代码
const fs = require('fs');

// 异步写入
// 文件名,待写入的数据,回调
fs.writeFile('./demo.txt', '积跬步至千里', (err) => {
    if (err) {
        console.log('写入文件失败');
        return;
    }
    console.log('写入文件成功');
})

// 同步写入
// fs.writeFileSync('./demo2.txt', '积小流成江海');

终端执行 node xxx.js 即可看到打印的信息,若成功写入则将得到包含 积跬步至千里demo.txt 文本。


appendFile 追加写入

异步追加写入使用 appendFile 接口,同步追加写入使用 appendFileSync 接口。

  • \r\n 表示回车后换行
javascript 复制代码
const fs = require('fs');

// 异步追加写入
fs.appendFile('./demo.txt', '\r\n积小流成江海', (err) => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

// 同步追加写入
// fs.appendFileSync('./demo.txt', '\r\n积小流成江海');

writeFile 追加写入

使用 writeFile 也可以实现追加写入,但要添加一个 flag 标识(如下代码的 { flag: 'a' })。

javascript 复制代码
const fs = require('fs');

// writeFile 实现追加写入,添加 flag
fs.writeFile('./demo.txt', '\r\n使用writeFile追加写入', { flag: 'a' }, err => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

createWriteStream 流式写入

使用 createWriteStream 创建写入流对象,调用 write 方法进行流式写入。

javascript 复制代码
const fs = require('fs');

// 流式写入:适合大文件写入或频繁写入
// 创建写入流对象
const writeStream = fs.createWriteStream('./流式写入.txt');

writeStream.write("hello, ");
writeStream.write("node!\n");

// 适用于需要结束数据传输的场景,例如写入文件或发送数据到客户端后关闭连接。
writeStream.end();

// 适用于需要立即关闭流而不结束数据传输的场景,例如服务器关闭连接前执行一些清理工作。
// writeStream.close();

// 流式写入完成时触发
writeStream.on('finish', () => {
    console.log("All writes are now complete.");
})

readFile 文件读取

使用 readFile 进行异步文件读取,使用 readFileSync 进行同步文件读取。

javascript 复制代码
const fs = require('fs');

// 异步文件读取
fs.readFile('./demo.txt', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data.toString());
})

// 同步文件读取
// const data = fs.readFileSync('./demo.txt')
// console.log(data.toString());

createReadStream 流式读取

使用 createReadStrem 创建读取流对象。添加监听事件监听数据及读取完成。

javascript 复制代码
const fs = require('fs');

// 流式读取
// 创建读取流对象
const rs = fs.createReadStream('./demo.txt');

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

rs.on('end', () => {
    console.log('读取完毕!');
})

文件复制(同步)

同步文件复制即先使用 readFileSync 读取文件,再把读取到的文件作为内容写入新文件。

javascript 复制代码
const fs = require('fs');
const process = require('process');

// 同步复制
const data = fs.readFileSync('./demo.txt');
fs.writeFileSync('./demo2.txt', data);
// 读取一个描述 Node.js 进程的内存使用量对象,所有属性值都以字节为单位。
console.log(process.memoryUsage());

文件复制(流式)

流式文件复制即先创建 流式读取对象流式写入对象,然后再基于流式读取的内容进行流式写入至新文件。

javascript 复制代码
const fs = require('fs');
const process = require('process');

// 流式复制
const readStream = fs.createReadStream('./demo.txt');
const writeStream = fs.createWriteStream('./demo3.txt');

// 效果等同于 readStream.pipe(writeStream);
// readStream.on('data', chunk => {
//     writeStream.write(chunk)
// })

readStream.on('end', () => {
    console.log(process.memoryUsage());
})

readStream.pipe(writeStream);

rename 文件重命名

使用 rename 方法进行异步重命名文件;使用 renameSync 进行同步重命名文件。

javascript 复制代码
const fs = require('fs');

fs.rename('./demo.txt', './renameDemo.txt', err => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

// fs.renameSync('./renameDemo.txt', './demo.txt');

使用 unlinkrm 进行文件的异步删除,使用 unlinkSyncrmSync 进行文件的同步删除。

javascript 复制代码
const fs = require('fs')

// 通过 unlink 删除,同步 unlinkSync
fs.unlink('demo.txt', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

// 通过 rm 删除,同步 rmSync
// fs.rm('demo2.txt', err => {
//     if (err) {
//         console.log('err')
//         return
//     }
//     console.log('success')
// })

文件夹操作

mkdir 创建文件夹

使用 mkdir 进行文件夹的创建。

javascript 复制代码
const fs = require('fs')

// 创建 createDir 文件夹
fs.mkdir('./createDir', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

递归创建文件夹

使用 mkdir 可以进行递归创建文件夹(recursive - 是否以递归的方式创建目录,默认为 false)。

javascript 复制代码
const fs = require('fs')

// 递归创建
fs.mkdir('./a/b/c', {recursive: true}, err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})



readdir 读取文件夹

使用 readdir 进行文件的读取操作。

javascript 复制代码
const fs = require('fs')

// 读取文件夹
fs.readdir('../../node-learn', (err, data) => {
    if (err) {
        console.log('err', err)
        return
    }
    console.log('data', data)
})

rmdir 删除文件夹

使用 rmdir 进行对文件夹的删除。

javascript 复制代码
const fs = require('fs')

// 删除文件夹
fs.rmdir('./createDir', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

递归删除文件夹

使用 rm 进行递归删除文件夹(recursive: true 以递归的方式删除目录,默认为 false)。

javascript 复制代码
const fs = require('fs')

// 递归删除
fs.rm('./a', {recursive: true}, err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

stat 查看资源信息

提前准备好 demo.txt 文件,内容如下:

使用 stat 查看资源信息。

javascript 复制代码
const fs = require('fs')

fs.stat('./demo.txt', (err, data) => {
    if (err) {
        console.log('err')
        return
    }
    console.log(data)
    // 判断是否是文件
    console.log('判断是否是文件', data.isFile())
    // 判断是否是文件夹
    console.log('判断是否是文件夹', data.isDirectory())
})

__dirname & __filename

__dirname 表示当前文件所在目录的绝对路径。

__filename 表示当前文件所在目录的完整路径(包括文件名)。

javascript 复制代码
const fs = require('fs')

// 写入文件
fs.writeFileSync(__dirname + '/demo.txt', '绝对路径')

// 所在文件的所在目录的绝对路径
console.log('__dirname', __dirname)
// 当前文件的完整路径(包含文件名)
console.log('__filename', __filename)

总结

本篇文章我们学习了如何使用 Node.js 进行文件操作。包括文件的写入、追加写入、流式写入、文件复制、文件重命名、文件删除、文件夹操作、查看资源信息和获取绝对路径等。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Node.js教程(菜鸟教程)
  2. Node.js零基础视频教程(尚硅谷 · 李强)


相关推荐
一个假的前端男16 小时前
使用宝塔面板,安装 Nginx、MySQL 和 Node.js
mysql·nginx·node.js
晚风_END16 小时前
node.js|浏览器插件|Open-Multiple-URLs的部署和使用,实现一键打开多个URL的强大工具
服务器·开发语言·数据库·node.js·dubbo
我爱学习_zwj16 小时前
深入浅出Node.js-1(node.js入门)
前端·webpack·node.js
CodeChampion1 天前
68.基于SpringBoot + Vue实现的前后端分离-心灵治愈交流平台系统(项目 + 论文PPT)
java·vue.js·spring boot·mysql·elementui·node.js·idea
LLLuckyGirl~1 天前
node.js内置模块之---crypto 模块
node.js
LLLuckyGirl~2 天前
node.js版本管理之---npm 和 package.json
node.js
qq_458563812 天前
npm发布自定义包
前端·npm·node.js
单线程bug2 天前
npx和npm和pnpm的异同
前端·npm·node.js
itzixiao2 天前
使用npm 插件[mmdc]将.mmd时序图转换为图片
前端·npm·node.js