【Node.js】fs模块笔记
一、Node.js的应用
1、开发服务器的应用;
2、开发工具类的应用(webpack、vite、babel);
3、开发桌面端应用(electron)。
二、Node.js命令行工具
1、c盘如何切换d盘=> d: 回车
2、查看d盘下的内容=> dir 回车
3、查看d盘下的指定文件里的内容=> cd 文件名 回车 => dir
4、当前目录:.;上一级目录:..;
5、查看文件夹下所有文件内容【包括子文件夹下的内容】 dir /s;
6、停止运行 ctrl +c;
7、Tab自动补全代码。
三、使用Node.js运行JavaScript代码
第一步:选中JavaScript文件,点击右键
第二步:输入 node JavaScript.js【文件名】并且回车
四、Node.js注意事项
1、Node.js不能使用BOM和DOM的API,可以使用console和定时器API
2、Node.js中的顶级对象为global,也可以用globalThis访问顶级对象
五、Buffer
- Buffer:缓冲器,类似Array的对象,表示固定长度的字节序列【一段固定长度的内存空间,用于处理二进制数据】;Buffer大小固定且无法调整、性能较好、可以直接对计算机内存进行操作、每个元素的大小为1字节(byte)
- Buffer的创建
方式一:alloc (1)会对每个元素进行二进制清零
let buf_1=Buffer.alloc(10)
console.log(buf_1);
//<Buffer 00 00 00 00 00 00 00 00 00 00
方式二:allocUnsafe (1)不安全的原因在于创建时可能会包含旧的内存数据【内存空间可复用】,不会对每个元素进行二进制清零;(2)allocUnsafe速度会比alloc快;(3)每次运行的结果可能都不同
let buf_2=Buffer.allocUnsafe(10)
console.log(buf_2);
// <Buffer 18 e3 67 00 00 00 00 00 00 00>
方式三:from 把字符串或数组转为Buffer(1)字符转为Uncode码表的数字,数字再转为十六进制存在Buffer
let buf_3 = Buffer.from('hello')
console.log(buf_3);
//<Buffer 68 65 6c 6c 6f>
3、Buffer与字符串的转换(buffer.toString())
let buf = Buffer.from([105,108,111.118])
console.log(buf.toString());
// ilo
4、Buffer元素的读取
let buf=Buffer.from("hello")
// 十进制
console.log(buf[0]);//104
// 二进制
console.log(buf[0].toString(2));//1101000
5、对Buffer元素的修改
let buf=Buffer.from("hello")
// 十进制
console.log(buf[0]);//104
buf[0]=96
console.log(buf[0]);//96
6、Buffer的溢出:由于二进制数最大为255,一旦值超过255,会舍弃高位的数字,取低位数字
let buf =Buffer.from('hello')
buf[0]=300//出现溢出
console.log(buf[0]);//44
7、Buffer的中文
let buf = Buffer.from("欢迎")
console.log(buf);
//<Buffer e6 ac a2 e8 bf 8e>
六、计算机基础
1、计算机的组成
(1)CPU(中央处理器):计算机的运算和控制中心 (2)内存:存储数据,读写速度快,断电丢失数据 (3)硬盘:读写速度慢,断电后不丢失数据
2、程序的运算基本流程
操作系统【Windows、Linux、MacOS】:一种应用程序,用来管理和调度硬件资源。
程序一般保留在硬盘中,软件安装的过程就是将程序写入硬盘的过程。程序在运行时会加载进入内存,然后cpu读取并执行程序。
3、进程与线程
进程:运行中的程序; 线程:一个进程中执行的一个执行的一个执行流,一个线程是属于某个进程的。
七、fs(file System:文件系统)模块
1.fs模块可以实现与硬盘的交互
文件的创建、删除、重命名、移动, 文件内容的写入、读取, 以及文件夹的相关操作。
2.fs的异步和同步
异步写入(效率高)
/**
* 新建文件:text.txt
* 在text.txt内填充内容 123
*/
// 1、导入fs模块
const fs = require('fs');
// 2、异步写入文件 fs.writeFile(file,data[,options],callback)
// file文件名(文件如果不存在会新建该文件)
//data待写入的数据
//options选项设置(可选)
//callback写入回调
//返回值 undefined
fs.writeFile('./text.txt',"123",err=>{
// 写入失败返回错误对象;写入成功返回null
console.log(err);
})
同步写入(无回调)(易于理解)
/**
* 新建文件:text.txt
* 在text.txt内填充内容 123
*/
// 1、导入fs模块
const fs = require('fs');
fs.writeFileSync('./text.txt',"123",err=>{
// 写入失败返回错误对象;写入成功返回null
console.log(err);
})
3、fs的文件追加写入
appendFile异步的方式
// 1、引入fs模块
const fs = require('fs')
// appendFile:在文件尾部追加内容
//2、 异步追加:fs.appendFile(file,data[,options],callback)
fs.appendFile('./text.txt',"追加的内容",err=>{
if (err) throw err;
console.log(err);//null:表示追加成功
})
appendFileSync同步的方式
// 1、导入fs模块
const fs = require("fs")
// 同步追加:fs.appendFileSync(file,data[,options])
fs.appendFileSync("./text.txt","同步导入的内容")
想要使追加的内容进行换行使用“\r\n”
const fs = require("fs")
fs.appendFileSync("./text.txt","\r\n同步导入的内容")
writeFile实现内容的追加,通过设置{flag:'a'} 使用场景:程序日志
let fs = require("fs")
fs.writeFile('./text.txt',"writeFile追加内容",{flag:'a'},err=>{
if (err) {
console.log("追加失败");
return ;
}
console.log("追加成功");
})
4、fs的流式写入
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数 流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景
// 1、导入fs
let fs = require('fs')
// 2、创建写入流对象
let ws = fs.createWriteStream('./text.txt');
// 3、写入内容
ws.write('1111111\r\n');
ws.write('2222222\r\n');
// 4、关闭通道(可写可不写)
ws.close()
5、文件写入的场景(需要持久化保存数据)
(1)下载文件 (2)安装软件 (3)保存程序日志,如Git (4)编辑器保存文件 (5)视频录制
6、fs文件读取
异步读取
// 1、导入 fs
let fs = require("fs")
// 2、fs.readFile(path[,options],callback)
// path:文件路径;options:选项配置;callback:回调函数。
fs.readFile('./text.txt',(err,data)=>{
if (err) {
console.log("读取失败");
return;
}
console.log(data);
// <Buffer 31 32 33 e8 bf bd e5 8a a0 e7 9a 84 e5 86 85 e5 ae b9 e5 90 8c e6 ad a5 e5 af bc e5 85 a5 e7 9a 84 e5 86 85 e5 ae b9 0d 0a e5 90 8c e6 ad a5 e5 af bc ... 33 more bytes>
console.log(data.toString());
})
同步读取
let fs = require('fs')
let data = fs.readFileSync('./text.txt')
console.log(data.toString());
流式读取:一块一块的读取
// 1、引入fs模块
const fs = require('fs')
// 2、创建读取流对象
const rs = fs.createReadStream('./text.txt');
// 3、绑定data事件
rs.on('data',chunk=>{
console.log(chunk);
console.log(chunk.length);
});
rs.on('end',()=>{
// 提供效率
console.log("读取完成");
});
7、读取文件的应用场景
(1)电脑开机 (2)程序运行 (3)编辑器打开文件 (4)查看图片 (5)播放视频 (6)Git查看日志 (7)上传文件
8、复制文件
方式一:使用readFile
let fs = require('fs');
// 读取文件内容
let data = fs.readFileSync('./text.txt');
// 写入文件
fs.writeFileSync('./text_copy.txt',data)
方式二:使用流式操作(占用的内存空间会比方式一小)
// 1、导入fs模块
let fs = require('fs');
// 2、创建读取流对象
const rs = fs.createReadStream('./text.txt');
// 2、创建写入流对象
const ws = fs.createWriteStream('.text_copy.txt');
// 3、绑定data事件
rs.on('data',chunk=>{
ws.write(chunk)
})
9、文件的重命名
异步方式
// 1.导入fs模块
const fs = require('fs')
// 2.调用fs.rename(oldPath,newPath)方法
fs.rename("./text.txt",'./textNew.txt',err=>{
if (err) {
console.log("操作失败");
return;
}
console.log("操作成功");
})
同步方式
// 1.导入fs模块
const fs = require('fs')
// 2.调用fs.rename(oldPath,newPath)方法
fs.renameSync("./text.txt",'./textNew.txt')
批量重命名
// 1、导入fs模块
const fs = require('fs')
// 2、读取code文件夹
const files = fs.readdirSync('../t');
// 3、遍历数组
files.forEach(item =>{
// 拆分文件名
let data = item.split("-")
let [num,name]=data
// 判断
if (Number(num)<10) {
num="0"+num
}
// 创建新的文件名
let newName = num+'-'+name;
// 重命名
fs.renameSync(`../t/${item}`,`../t/${newName}`)
})
10、文件的移动
异步的方式
// 1.导入fs模块
const fs = require('fs')
// 2.文件移动 fs
fs.rename('./text.txt','../node/text.txt',err=>{
if (err) {
console.log("操作失败");
return;
}
console.log("操作成功");
})
同步的方式
// 1.导入fs模块
const fs = require('fs')
// 2.文件移动 fs
fs.renameSync('./text.txt','../node/text.txt')
11、fs文件的删除
方法一:调用unlink方法 (异步);同步使用unlinkSync
// 1、导入fs模块
const fs = require('fs')
// 2、调用unlink方法
fs.unlink('./text.txt',err=>{
if (err) {
console.log("删除失败");
return;
}
console.log("删除成功");
})
方法二:调用rm方法(异步);同步使用rmSync
// 1、导入fs模块
const fs = require('fs')
// 2、调用unlink方法
fs.rm('./text.txt',err=>{
if (err) {
console.log("删除失败");
return;
}
console.log("删除成功");
})
12、实现文件夹操作
(1)文件夹的创建
异步:fs.mkdir(path) 同步:fs.mkdirSync(path) 递归目录需要设置{recursive:true}
// 1、导入fs模块
let fs = require('fs')
// 2、创建文件夹
fs.mkdir('./newFile',err=>{
if(err){
console.log("创建失败");
return;
}
console.log("创建成功");
})
//3、递归创建目录需要设置{recursive:true},否则会报错
fs.mkdir('./a/b/c',{recursive:true},err=>{
if (err) {
console.log("创建失败");
return;
}
console.log("创建成功");
})
(2)读取文件夹
let fs = require('fs')
fs.readdir('../Buffer',(err,data)=>{
if (err) {
console.log(err);
return;
}
console.log(data);
})
(3)删除文件夹
let fs = require('fs')
fs.rmdir('./newFile',err=>{
if (err) {
console.log("删除失败");
return;
}
console.log("删除成功");
})
对应递归删除不推荐以下方法
let fs = require('fs')
// 当删除的文件里的文件夹内容不为空,即要进行递归删除,需要调用{recursive:true},否则报错
fs.rmdir('./a',{recursive:true},err=>{
if (err) {
console.log("删除失败");
return;
}
console.log("删除成功");
})
对于递归商城推荐以下方法
let fs = require('fs')
fs.rmSync('../node',{recursive:true})
13、查看资源状态
// 1、导入fs模块
const fs = require("fs");
// 2、调用fs.stat()方法
fs.stat("./text.txt", (err,data) => {
if (err) {
console.log("操作失败");
return;
}
console.log(data);
// isFile:判断是否文件
console.log(data.isFile());
// isDirectory:判断是否是文件夹
console.log(data.isDirectory());
});
14、路径
相对路径
// 1、导入fs模块
const fs = require('fs')
// 相对路径
fs.writeFileSync('./text2.txt',"text2")
fs.writeFileSync('text3.txt',"text3")
fs.writeFileSync('../text4.txt',"text4")
由于相对路径参照物:命令行的工作目录
// 绝对路径 '全局变量'保存的是:所在文件的所在目录
console.log(__dirname);
let fs = require('fs')
fs.writeFileSync(__dirname+"/text.txt","1111")
绝对路径是以盘符开头
// 1、导入fs模块
const fs = require('fs')
// 绝对路径:以盘符开头
fs.writeFileSync('D:/txt',"text")
转载自:https://juejin.cn/post/7285185696120733733