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零基础视频教程(尚硅谷 · 李强)


相关推荐
垣宇11 小时前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
爱吃南瓜的北瓜12 小时前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
翻滚吧键盘12 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js
浪九天13 小时前
node.js的版本管理
node.js
浪九天15 小时前
node.js的常用指令
node.js
浪九天17 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
小纯洁w1 天前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
熬夜不洗澡1 天前
Node.js中不支持require和import两种导入模块的混用
node.js
bubusa~>_<1 天前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
天下皆白_唯我独黑1 天前
npm 安装扩展遇到证书失效解决方案
前端·npm·node.js