目录
一、什么是fs模块?
fs(file system)
模块是nodejs提供的用于访问本地文件系统的功能模块,它使得运行于nodejs环境下的JavaScript具备直接读写本地文件的能力。
fs模块是nodejs的核心模块之一,只要安装了nodejs,就可以直接使用,不需要单独安装。
二、fs文件操作
1、writeFile 异步写入
一个JS主线程,主线程继续往下走,把磁盘写入交给另外一个线程。
异步的效率比同步的高。
也可以实现追加写入,即把第三个参数设置为{flag:'a'}即可。
//1、导入fs模块
const fs = require('fs');
//2、写入文件
fs.writeFile('./座右铭.txt','Talk is cheap,show me code.',err =>{
//如果写入失败,则err的值就是一个错误对象
//如果写入成功,则err的值为null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
//fs.writeFile(file,data[,options],callback);
//file是文件名,表示你写的数据存放的位置,如果该文件不存在,则自动创建一个文件
//data是待写入的数据
//options是选项设置(可选)
//callback是写入回调
2、writeFileSync 同步写入
//1、导入fs模块
const fs = require('fs');
//2、同步写入
fs.writeFileSync('./座右铭1.txt','Nothing is impossible.');
3、appendFile 异步追加写入
参数和writeFile一样
//1、引入fs模块
const fs = require('fs');
//2、调用appendFile
fs.appendFile('./座右铭.txt','一星陨落,暗淡不了星空灿烂',err =>{
//判断
if(err){
console.log('写入失败');
return;
}
console.log('追加写入成功');
});
4、appendFileSync 同步追加写入
//1、引入fs模块
const fs = require('fs');
//2、同步追加
fs.appendFileSync('./座右铭1','\r\n一花凋零,荒芜不了整个春天。');
//如果想换行,在追加的文本里面加,\r\n,即可
5、createWriteStream 流式写入
//1、导入fs
const fs = require('fs');
//2、创建写入流对象
const ws=fs.createWriteStream('./观书有感.txt');//就一个参数,文件路径名
//3、write
ws.write('关山难越,谁悲失路之人?');
ws.write('萍水相逢,尽是他乡之客。');
ws.write('老当益壮,宁移白首之心?');
ws.write('穷且益坚,不坠青云之志。');
//4、关闭通道
ws.close();
6、readFile 异步读取
//1、引入fs模块
const fs = require('fs');
//2、异步读取
fs.readFile('观书有感.txt',(err,data) => {
if(err){
console.log('读取失败');
return;
}
console.log(data);//打印出来的是十六进制数
console.log(data.toString());
});
//回调函数中两个参数,err是错误信息,data是文件内容
//fs.readFile(path[,options],callback);
//path:文件路径
//options: 选项配置
//callback: 回调函数
7、readFileSync 同步读取
//1、引入fs模块
const fs = require('fs');
//3、同步读取
let data = fs.readFileSync('./观书有感.txt');//只有一个参数
console.log(data);
console.log(data.toString());
8、createReadStream 文件流式读取
一块一块地读取,每读取完一块,就执行一下回调函数。
//1、引入fs模块
const fs = require('fs');
//2、创建读取流对象
const rs = fs.createReadStream('./观书有感.txt');
//3、绑定data事件
rs.on('data',chunk =>{
console.log(chunk);
});
//4、end 可选事件
rs.on('end',() =>{
console.log('读取完成');
});
9、rename 文件重命名与移动(异步)
将'座右铭.txt'重命名为'论语.txt'。
//文件重命名
//1、导入fs模块
const fs = require('fs');
//2、调用rename方法
fs.rename('./座右铭1','./论语.txt',err =>{
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
将'观书有感.txt'移动到hello文件夹里
//文件移动
//1、导入fs模块
const fs = require('fs');
//2、调用rename
fs.rename('./观书有感.txt','../hello/data.txt',err => {
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
10、renameSync 重命名与移动(同步)
fs.renameSync(oldPath,newPath);
11、unlink 文件删除(异步)
两种方法也都有对应的同步方法
//1、导入fs模块
const fs = require('fs');
/2、调用unlink方法
fs.unlink('./观书有感.txt',err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
nodejs14.4版本引入了一个新的方法,用来删除文件
//1、导入fs模块
const fs = require('fs');
//2、调用 rm 方法
fs.rm('./观书有感.txt',err =>{
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
三、fs文件夹操作
1、mkdir 创建文件夹
//1、导入fs模块
const fs = require('fs');
//2、mkdir
fs.mkdir('./观书有感',err =>{
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
//三个参数,第二个参数是可选配置
递归版
一次性在a文件夹中创建b文件夹,在b文件夹中创建c文件夹
//1、导入fs模块
const fs = require('fs');
//2、mkdir
fs.mkdir('./a/b/c',{recursive: true},err =>{
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
取消vscode文件夹重叠效果:
点开vscode左下角地设置,搜索compact,将第一个选项取消勾选即可。
2、readdir 读取文件夹
//1、导入fs模块
const fs = require('fs');
//2、readdir
fs.readdir('./观书有感',(err,data) =>{
if(err){
console.log('读取失败');
return;
}
console.log(data);
});
//返回的是一个数组,里面包含子文件或文件夹的名称
3、rmdir 删除文件夹
单个的删除
//1、导入fs模块
const fs = require('fs');
//2、rmdir
fs.rmdir('./观书有感',err =>{
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
递归的删除(同时删除其子目录)
//1、导入fs模块
const fs = require('fs');
//2、rm
fs.rm('./a',{recursive:true},err =>{
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
四、查看资源状态
//1、导入fs模块
const fs = require('fs');
//2、调用stat方法
fs.stat('./观书有感.txt',(err,data) =>{
if(err){
console.log('操作失败');
return;
}
console.log(data);
});
size:文件的大小
atime:最后一次访问的时间
mtime:最后的修改时间
ctime:最后一次修改文件状态的时间
birthtime:文件的创建时间
检测是不是文件
console.log(data.isFile());
检测是不是文件夹
console.log(data.isDirectory());
五、fs实践
1、文件复制
两种方式,第二种流式操作更好,资源占用更少。
//第一种,用readFile
//1、引入fs模块
const fs = require('fs');
//2、读取文件内容
let data = fs.readFileSync('./观书有感.txt');
//3、写入文件
fs.writeFileSync('./观书有感1.txt',data);
//第二种,用流式操作
//1、引入fs模块
const fs = require('fs');
//2、创建读取流对象
const rs = fs.createReadStream('./观书有感.txt');
//3、创建写入流对象
const ws = fs.createWriteStream('./观书有感2.txt');
//3、绑定data事件
rs.on('data',chunk => {
ws.write(chunk);
})