0x00 fs模块的引入
fs模块是nodejs的核心模块,不需要通过npm进行安装即可使用,使用方法为
const fs = require('fs')
0x01 fs模块中函数介绍
1. fs.stat(path,callback)
stat函数实现的功能是读取文件的状态,注意,stat函数是异步操作,若需使用同步操作,需要使用匿名自执行函数来模拟同步。
例:
fs.stat('test',(err,stats)=>{
if(err)
{
console.log(err);
return false;
}
console.log('文件:' + stats.isFile());
console.log('目录:' + stats.isDirectory());
})//注意stat()是异步操作
2 fs.mkdir(path,callback)
mkdir实现的功能是创建一个目录,若创建已有的目录会报错
例:
fs.mkdir('fs01',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('创建目录成功');
})
3 fs.writeFile(path,data,callback)
writeFile是写入数据到指定文件,会覆盖掉文件以前的数据,若没有文件则会创建文件。
例:
fs.writeFile('fs01/writeFile.txt','hello world',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('写入成功');
})
4 fs.appendFile(file,data,callback)
appendFile不会覆盖以前的数据,而是将数据加到原文件后面。
例:
fs.appendFile('fs01/writeFile.txt','\n这是新加的内容',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('追加内容成功');
})
5 fs.readFile(path,callback)
readFile将指定文件内容读入data中
例:
fs.readFile('fs01/writeFile.txt',(err, data) =>{
if(err)
{
console.log(err);
return false;
}
else
console.log(data.toString());
})
6 fs.readdir(path,callback)
readdir将指定目录读入data中,data中保存了该目录下的文件与文件夹
例:
fs.readdir('fs01',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log(data);
})
7 fs.rename(oldpath,newpath,callback)
rename可以更改文件的名字,也可以用来更改文件的地址
例:
fs.rename('fs01/new 2.txt','./fs01/rename.txt',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('改名成功');
})//也可用来更换文件地址
8 fs.rmdir
rmdir删除指定目录,注意,不能删文件
例:
fs.rmdir('fs',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('成功删除');
})//只用来删目录,删文件用unlink
9 fs.unlink(path,callback)
unlink删除指定文件,不能删目录
例:
fs.unlink('fs01/writeFile.txt',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('成功删除');
})
0x02 fs demo-几个小功能的实现
1 判断是否有某目录,如果没有则创建
var fs = require('fs');
fs.stat('Upload',(err,stats)=>{
if(err)
{
fs.mkdir('Upload',(err)=>{
if(err)
{
console.log(err);
return false;
}
else
console.log('目录已创建');
})
}
else
console.log(stats.isDirectory());
})//判断是否有某目录,若没有则创建
2 读取某个目录下的所有文件夹,并将其打印出来
你可能会这么写
//错误代码,stat函数是异步函数,for循环出错,此处应该用匿名自执行函数实现同步
const fs = require('fs');
var file=[];
fs.readdir('Upload',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
{
for(var i=0;i<data.length;i++)
{
fs.stat(data[i],(error,stats)=>{
if(stats.isDirectory())
file.push(data[i]);
})
}
console.log(file);
}
})
乍一看感觉没有问题,先判断是否有目录,然后for循环对目录下的每个文件进行判断,判断是否是目录,是的话就push到数组里,最后再打印数组。
但是这里犯了一个错误,那就是stat()函数是一个异步函数,不能直接用for循环,假定这个目录下面有三个文件两个目录,那么data.length就是5,而for循环中执行了五次stat,但每次stat的i都等于5,也就是执行的函数是fs.stat(data[5]),自然这里就会报错。
这个问题的解决办法就是使用匿名自执行函数来模拟同步
const fs = require('fs')
var file=[];
fs.readdir('Upload',(err,data)=>{
if(err)
{
console.log(err);
return false;
}
else
{
(function getFile(i){
if(i==data.length)
{
console.log(file);
return true;
}
fs.stat('Upload/'+data[i],(err,stats)=>{
if(stats.isDirectory())
file.push(data[i]);
getFile(i+1);
})
})(0)
}
})