node系列--【node中的文件模块】
node中的文件模块
作用可以添加、修改、删除操作系统的文件。必须引入 fs 模块
一、 文件操作
a) 写入文件 改写 与 覆盖
改写: appendFile
覆盖: writeFile
// 异步语法
let fs = require("fs");
/* fs.writeFile("./ok.txt","大家好",()=>{
console.log("写入完成");
}) */
/* fs.appendFile("./ok.txt","床前明月光",(err)=>{
console.log("第一句写入完成");
fs.appendFile("./ok.txt","疑似地上霜",(err)=>{
console.log("第二句写入完成");
fs.appendFile("./ok.txt","举头望明月",(err)=>{
console.log("第三句写入完成");
fs.appendFile("./ok.txt","低头思故乡",(err)=>{
console.log("第四句写入完成");
})
})
})
}) */
// 也可以使用async...await解决回调嵌套的问题,
async function fn(){
let a = await wFile("床前明月光");
console.log( a );
let b = await wFile("疑似地上霜");
console.log( b );
let c = await wFile("举头望明月");
console.log( c );
}
fn()
function wFile(str){
return new Promise((resolve,reject)=>{
fs.appendFile("./ok.txt",str,(err)=>{
if(!err){
resolve("写入成功")
}else{
reject("写入失败")
}
})
})
}
// 同步语法
// fs.writeFileSync("./hello.txt","星期五");
b)读文件 readFile
let fs = require("fs");
// 参数1:路径; 参数二:回调函数,注意读文件操作回调函数中有两个参数:err和data
fs.readFile("./ok.txt",(err,data)=>{
if(!err){
console.log( data.toString("utf8") );
}else{
console.log("读取失败");
}
})
c) 删除文件 unlink
let fs = require("fs");
fs.unlink("./hello.txt",(err)=>{
if(!err){
console.log("删除完成");
}else{
console.log("删除失败");
}
})
d) 判断文件是否存在 exists
let fs = require("fs");
// 返回布尔值,是否存在指定的文件
// console.log( fs.existsSync("./ok.txt") );
// 异步
fs.exists("./hello.txt",(exists)=>{
console.log( exists );
})
e)获取文件信息 stat()
fs.stat("./ok.txt",(err,status)=>{
if(!err){
console.log(status);
// 是否为目录
console.log( status.isDirectory() ); //false
// 是否为文件
console.log( status.isFile() ); //true
}
})
二、目录操作
a) 创建目录 mkdir()
fs.mkdir("./ok",(err)=>{
if(!err){
console.log( "目录创建成功");
}
})
b) 删除目录 rmdir()
// 注意,只能删除空目录。
fs.rmdir("./ok",(err)=>{
if(!err){
console.log( "目录删除成功");
}else{
console.log( err );
}
})
c) 读目录 readdir()
let fs = require("fs");
// 读取指定目录,将目录下的文件名和子目录名称以数组返回
fs.readdir("./ok",(err,files)=>{
if(!err){
console.log( files ); //[ '323.txt', 'hello', 'ok.txt' ]
}
})
问题:读取指定目录下的所有文件内容,打印输出
// 递归思路:
// 1)遍历读目录返回的数组,判断是否为文件;
// 2)如果是文件就使用 fs.readFile()读取文件内容。如果是目录就递归调用函数本身再次读取目录,重复第一步
function readDir(url){
// 第一次调用时 url : ./ok
// 第二次调用时 url : ./ok/hello
fs.readdir(url,(err,files)=>{
// console.log( files ); // 第一次 [323.txt, hello, ok.txt]
// 第二次 [01.txt, 02.txt]
for(let item of files){
// console.log( item );
fs.stat(url+"/"+item,(err,status)=>{
if( status.isFile() ){
// 说明是文件,直接读取文件内容
fs.readFile(url+"/"+item,(err,data)=>{
console.log( data.toString());
})
}else{
// 说明是目录。
readDir( url+"/"+item ) // ./ok/hello
}
})
}
})
}
readDir("./ok");
// 同步语法实现
function readDir(url){
let files = fs.readdirSync(url);
for(let item of files){
let status = fs.statSync(url+"/"+item);
if( status.isFile() ){
let data = fs.readFileSync(url+"/"+item)
console.log( data.toString());
}else{
readDir(url+"/"+item)
}
}
}
readDir("./ok");