1.文件写入部分
/*
* 需求:
* 新建一个文件,座右铭.text,写入内容,三人行,则必有我师焉
*/
//1. 导入fs模块
const fs=require('fs');
//2. 写入文件
/*
*file 文件名
*data 写入的数据
*options 选项的设置(可选)
*callback 写入回调
*/
//这一块的话 是异步的 I/O //总共有两个线程:一个是js 一个是磁盘的I/O线程
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err=>{
//err 写入失败:错误的对象 写入成功:null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
console.log(1+1);
//同步写入 //这个是I/O线程 会停掉js线程 写完以后 继续执行js线程
fs.writeFileSync('./data.txt','test');
2.文件的追加写入
/*
追加写入可以在日志中进行使用
*/
//1.在座右铭.txt的文件中追加写入
const fs=require('fs');
//2.调用 appendFile
// fs.appendFile('./座右铭.txt',',择其善者而从之,其不善者而改之',err=>{
// if(err){
// console.log('写入失败~');
// return;
// }
// console.log('追加写入成功!');
// });
// 同步的写入
// fs.appendFileSync('./座右铭.txt','\r\n温故而知新,可以为师矣.');
//fs.watchFile 也可以进行追加写入
fs.writeFile('./座右铭.txt','love love love',{flag:'a'},err=>{
if(err){
console.log('写入失败')
return
}
console.log('写入成功!')
})
3.流式写入
/**
*观书有感.txt
*这个相比writeFile 可以用于写入频次较高的场景 这的话 就能不关闭通道的状态下 间歇性地写入
*/
//1.导入 fs
const fs= require('fs');
//2.创建写入流对象 //这一步仅仅是打开了I/O流的通道
const ws=fs.createWriteStream('./观书有感.txt');
//3.write 写入
ws.write('半亩方糖一片开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');
//4.关闭通道
ws.close(); //这个close 可写可不写
4.文件读取
//1.引入fs模块
const fs=require('fs');
//2.异步读取
// fs.readFile('./观书有感.txt',(err,data)=>{
// if(err){
// console.log('读取失败');
// return
// }
// console.log(data.toString());
// })
//3.同步读取
let data =fs.readFileSync('./观书有感.txt');
console.log(data.toString());
5.流式读取
//1.引入fs模块
const fs =require('fs');
//2.创建读取流对象
const rs=fs.createReadStream('./观书有感.txt');
//3.绑定 data 事件 //chunk 块
rs.on('data',chunk=>{
console.log(chunk.length); //多少个字节 => kb
})
//4.end事件 可选的事件
rs.on('end',()=>{
console.log('读取完成')
})
6.文件复制
/*
需求:将观书有感.txt这个文件复制一份
*/
const fs=require('fs');
const process=require('process'); //这个是node.js其中的一个内置的内存变量 可以看代码执行的时候所占用的内存空间
//方式一: readFile //一次性将文件全部读在内存当中
//读取文件的内容
// let data = fs.readFileSync('./观书有感.txt');
//写入文件
// fs.writeFileSync('./观书有感2.txt',data);
// console.log(process.memoryUsage()); //当前内存的使用量 rss 单位字节 20439040/1024/1024
//方式二: 流式操作
//创建读取流对象 //这个是读一点 写一点
const rs=fs.createReadStream('./观书有感.txt');
//创建写入流对象
const ws=fs.createWriteStream('./观书有感3.txt');
//绑定data事件 //每次只取64kb的 只占64kb内存 //rss 20783104/1024/1024 文件过小 差别不大
rs.on('data',chunk=>{
ws.write(chunk);
})
rs.on('end',()=>{
console.log(process.memoryUsage());
})
//方式三 管道复制
// rs.pipe(ws);
7.文件重命名
//1.导入 fs 模块
const fs=require('fs');
//2.调用 rename 方法 进行重命名
// fs.rename('./座右铭.txt','./论语.txt',err=>{
// if(err){
// console.log('重命名失败');
// return
// }
// console.log('重命名成功!')
// })
//3.rename 方法也可以用于文件的移动
fs.rename('./论语.txt','./测试/data.txt',err=>{
if(err){
console.log('文件移动失败!')
return
}
console.log('文件移动成功!')
})
/*
fs.renameSync 两个参数 同步执行 不再演示
*/
8.文件删除操作
// 1.导入 fs 模块
const fs =require('fs');
// 2. 调用 unlink 方法
// fs.unlink('./观书有感3.txt',err=>{
// if(err){
// console.log('删除成功!')
// return
// }
// console.log('删除失败!')
// })
//3.rm方法 在node 14.4中引入的
fs.rm('./观书有感2.txt',err=>{
if(err){
console.log('删除成功!')
return
}
console.log('删除失败!')
})
9.文件夹操作
//1.导入 fs 模块
const fs =require('fs');
//2.创建文件夹 mk make制作 dir directory 文件夹
// fs.mkdir('./html',err=>{
// if(err){
// console.log('创建文件夹失败');
// return
// }
// console.log('创建文件夹成功');
// })
// 2-2 递归创建
// fs.mkdir('./a/b/c',{recursive:true},err=>{
// if(err){
// console.log('创建文件夹失败');
// return
// }
// console.log('创建文件夹成功');
// })
// 2-3 文件夹的读取
// fs.readdir('./html',(err,data)=>{ //这个方法可以得到文件夹中的资源名称 //返回的是一个数组
// if(err){
// console.log('读取失败')
// return
// }
// console.log(data)
// })
// 2-4 删除文件夹
// fs.rmdir('./html',err=>{
// if(err){
// console.log('删除文件夹失败')
// return
// }
// console.log('删除文件夹成功')
// })
// 2-5 递归删除
//recursive这个属性之后会被移除 不推荐使用rmdir
// fs.rmdir('./a',{recursive:true},err=>{
// if(err){
// console.log('删除文件夹失败')
// return
// }
// console.log('删除文件夹成功')
// })
//推荐使用
fs.rm('./a',{recursive:true},err=>{
if(err){
console.log('删除文件夹失败')
return
}
console.log('删除文件夹成功')
})
10.查看信息资源
// 1.导入 fs 模块
const fs= require('fs');
//2. stat 方法 status 缩写
fs.stat('./观书有感.txt',(err,data)=>{
if(err){
console.log('查看文件状态失败!')
return
}
console.log(data) //返回资源文件的信息
console.log(data.isFile()) //这个资源是不是一个文件
console.log(data.isDirectory()) //这个资源是不是一个文件夹
})
11.文件路径
// 1. 导入 fs 模块
const fs=require('fs');
//相对路径 //这个相对目录参照的是 命令行所执行的目录
// fs.writeFileSync('./index.html','love');
//绝对路径写入
fs.writeFileSync('D:/index测试.html','cceshi');
12.相对路径的bug
//1. 导入 fs 模块
const fs=require('fs');
//相对路径
// console.log(__dirname,'保存的是所在文件所在目录的绝对路径')
fs.writeFileSync(__dirname+'/index.html','love1');
13.文件批量重命名
// 导入 fs 模块
const fs =require('fs');
// 读取 code 文件夹
const files =fs.readdirSync('./code');
console.log(files);
//遍历数组
files.forEach(item=>{
//1.拆分文件名
let data =item.split('-');
// console.log(data);
let [num,name] =data;
//判断
// console.log(num,name,'数字,文件名');
if(Number(num)<10){
num='0'+num
}
//创建新的文件名
let newName=num+'-'+name;
console.log(newName,'新名字')
//重命名
fs.renameSync(`./code/${item}`,`./code/${newName}`)
})