// fs 模块中带Sync的方法为同步方法
// 使用fs模块一般会使用到路径,配合path模块共同使用
导入path模块
const path = require("path");
导入fs模块
const fs = require("fs");
// console.log(fs);
/*
01-读文件 readFile
fs.readFile(path,回调函数)
node中一般遵循错误先行,回调函数第一个参数为 err
注意:读文件的路径一定要完整
*/
异步读取(推荐使用)
fs.readFile(path.resolve(__dirname,"./source/doc.txt"),(err,data)=>{
// 如果有错误抛出错误
if(err) throw err
console.log(err);
console.log(data.toString());
})
同步读取(不推荐使用)
let res = fs.readFileSync(path.resolve(__dirname,"./source/doc.txt"))
console.log(res);
/*
02-写文件 writeFile:将指定内容写入文件
fs.writeFile(
path,
要写入的内容,
{
// 实际可以不用写这个参数,默认为utf-8,w模式
encoding:"utf-8",
flag:"w" // 写文件的模式。w:覆盖内容;a:追加内容
},
回调函数
)
注意:如果指定路径不存在,会先创建文件,再进行写入
*/
fs.writeFile(
path.resolve(__dirname,"./source/doc.txt"),
"今天想吃蛋炒饭",
{
encoding:"utf-8",
flag:"w"
},
(err)=>{
if(err) throw err
console.log("写入成功");
}
)
// 一般写以下这种
fs.writeFile(path.resolve(__dirname,"./source/yangr.txt"),"今天想吃蛋炒饭",(err)=>{
if(err) throw err
console.log("写入成功");
}
)
写入图片
// 先读取图片信息才能进行写入
// 读取图片
let imgdata = fs.readFileSync(path.resolve(__dirname,"./source/1.png"))
console.log(imgdata);
// 写入图片
fs.writeFile(path.resolve(__dirname,"11.png"),imgdata,(err)=>{
if(err) throw err
console.log("写入图片成功");
})
判断文件是否存在 existsSync
console.log(fs.existsSync(path.resolve(__dirname,"./source/1.png")));
操作(创建)文件夹(目录)
// 路径指向存在该目录,再创建同名目录会报错
fs.mkdir(path.resolve(__dirname,"./bin"),0o777,(err)=>{
if(err) throw err
console.log("创建目录成功");
})
读目录返回该目录下的子文件和子目录的名称
fs.readdir(path.resolve(__dirname,"./source"),(err,info)=>{
if(err) throw err
console.log(info);
})
判断是文件还是文件夹
fs.readdir(path.resolve(__dirname,"./source"),(err,arr)=>{
if(err) throw err
arr.forEach(v=>{
fs.stat(path.resolve(__dirname,"./source",v),(err,stats)=>{
if(stats.isFile()){
console.log(v+"是文件");
}else{
console.log(v+"是文件夹(目录)");
}
})
})
})
删除文件
fs.unlink(path.resolve(__dirname,"./source/1.png"),err=>{
if(err) throw err
console.log("删除成功");
})
删除文件夹
fs.rmdir(path.resolve(__dirname,"./bin"),err=>{
if(err) throw err
console.log("删除文件夹成功");
})
重命名文件
fs.rename(
path.resolve(__dirname,"./source"),
path.resolve(__dirname,"./source1"),
(err)=>{
if(err) throw err
console.log("修改成功");
}
)
监听文件的变化(热更新)
const fs = require("fs");
fs.watchFile("./1.txt",(curr,prev)=>{
// console.log(curr,"--------",prev);
console.log("修改了文件");
fs.unwatchFile("./1.txt"); // 移除对该文件的监听(注意:要在监听文件方法里面使用)
})
流
读文件,写文件有时会遇到大文件,此时readFile,writeFile就已经不再适用,它们只适合读写小文件,是一次性全部读完文件,再把读到的文件数据放到缓存里,以供后续的操作
// 创建可读流(用流的方式来读文件)
let readStream = fs.createReadStream("./dpcq.txt");
// 监听可读流读数据的过程
readStream.on("data",data=>{
console.log(data);
console.log("------------------------------------");
})
// 数据全部读取完会触发
readStream.on("end",()=>{
console.log("数据全部读取完毕");
})
let readStream = fs.createReadStream("./dpcq.txt");
let writeStream = fs.createWriteStream("./yr.txt",{encoding: "utf8"});
readStream.on("data",data=>{
// 将读到的内容写入到目标文件
writeStream.write(data);
})
// 全部读取完毕触发
readStream.on("end",()=>{
writeStream.end(); // 结束写入
console.log("写入成功");
})
// 用管道 pipe 可以简化以上的读写操作(推荐使用)
fs.createReadStream("./dpcq.txt").pipe(fs.createWriteStream("./yr.txt"))