其实早就想写这一篇文章了,为什么到现在才写?因为懒啊!
好了,不多说了,写这篇文章主要是想记个笔记,以后再写node程序的时候,如果用得上fs文件系统,可以过来copy,简直不要太爽!!当然了,我不可能把官网的东西都给拽过来,那样我还不如去官网直接看呢,还省劲儿,这篇文章主要是记录一些平时用得着的方法就可以了,都起开,我要开始装逼了!!!
首先要引进来模块!各位看官应该都会吧,如不会,请自行选择如下方法
const fs = require('fs');
1.读文件
let data = fs.readFileSync('1.js',{'encoding': 'utf8'});
data = eval('('+ data +')');//或者JSON.parse(data);
我个人比较喜欢同步操作的方法,顺序执行,它不香吗?
2.写文件
fs.writeFileSync('1.txt','你好,三哥,你真帅啊!',{'encoding': 'utf8'});
fs.writeFileSync('1.json',data,{'encoding': 'utf8'});
再补充一个JSON.stringify的参数的方法
JSON.stringify(value[, replacer [, space]])
JSON.stringify(data,null,10);
3.创建可读流和可写流并写入
//通过读取一个文件内容并将内容写入到另外一个文件中。
const fs = require('fs');
//创建一个可读流
let readerStream = fs.createReadStream('1.json');
//创建一个可写流
let writerStream = fs.createWriteStream('./2.json');
//管道读写操作
//读取1.json的内容,并将内容写入到2.json文件中
readerStream.pipe(writerStream);
4.判断一个文件是否存在
let isExist = fs.existsSync('./1.js');
如果结果为true,就是存在,如果结果为false就是不存在,很简单!
5.判断一个路径是否是文件夹
judgeDir(path){
let stat = fs.lstatSync(path);
let isDir = stat.isDirectory();
return isDir;
}
直接贴一个方法吧,到时候直接封装,就行,返回true,就是文件夹,返回false,就不是文件夹
6.遍历文件夹
let arr = fs.readdirSync('./js');//同步真香!
遍历出来了,下面再贴一个,深度递归遍历一个目录的代码,我自己写的
//遍历
let tree = [];//定义一个树(空数组)
function mapDirs(dir){//这个是遍历目录文件的函数
let myDirs = fs.readdirSync(dir);//首先先同步读出传入的目录,结果是一个数组
if(myDirs.length > 0){//当读出来的目录数组的长度大于0时,说明底下是有子文件的
if(tree.length == 0){//当tree开始是一个空数组时,先把最外层的文件全部push进去
myDirs.forEach(item => {//遍历这个最外层文件的数组
var start = fs.lstatSync('./'+item);//判断是不是文件夹;
let startState = start.isDirectory();//判断是不是文件夹;
tree.push({
id:'./'+item,//id为自己的路径
name:item,
isDir:startState,//把是不是文件夹的状态加进来,用来显示不同的小图标,比如文件夹还是文件的小图标
children:[]
});
let path;
if(dir != './'){//假如不是最外层,需要把每一次的目录都要加/来和item拼成一个查询item的路径
path = dir + '/' + item;
}else{//假如是最外层,就不用加/,因为'./' 自带斜杠
path = dir + item;
}
var stat = fs.lstatSync(path);//判断是不是文件夹;
let state = stat.isDirectory();//判断是不是文件夹;
if(state){//如果是文件夹的话,递归整个函数,继续把新生成的路径放进这个函数里面,进行递归查找
mapDirs(path);
}
})
}else{//当tree开始不是一个空数组时
myDirs.forEach(item => {
mapTree(tree,dir,item);//先把传入的路径和整个树进行递归对比,如果id是一样的,那么就把这个item push进这个选项的children数组中
let path;
if(dir != './'){//假如不是最外层,需要把每一次的目录都要加/来和item拼成一个查询item的路径
path = dir + '/' + item;
}else{//假如是最外层,就不用加/,因为'./' 自带斜杠
path = dir + item;
}
var stat = fs.lstatSync(path);//判断是不是文件夹;
let state = stat.isDirectory();//判断是不是文件夹;
if(state){//如果是文件夹的话,递归整个函数,继续把新生成的路径放进这个函数里面,进行递归查找
mapDirs(path);
}
})
}
}
}
//遍历tree
function mapTree(tree,id,item){//递归遍历tree数组,然后根据id判断把这个item push进这个选项的children数组中
let path = id + '/' + item;
let stat = fs.lstatSync(path);
let state = stat.isDirectory();//判断是不是文件夹;
for(let i = 0; i< tree.length;i++){
if(tree[i].id == id){
tree[i].children.push({
id:id + '/' + item,//继续把路径当作id
name:item,
isDir:state,//把是不是文件夹的状态加进来,用来显示不同的小图标,比如文件夹还是文件的小图标
children:[]
})
}else if(tree[i].children.length > 0){
mapTree(tree[i].children,id,item);
}
}
}
注: 如果你想判断是不是空文件夹,那么直接遍历这个文件夹,如果数组为空,就是空的呗,如果不是空,那么就不是空文件夹呗!!!!!!
7.删除文件夹
fs.rmdirSync(url)
巴特,fs的这个删除文件夹有个巨坑,就是它只能删除空文件夹,只要里边有一个文件,哪怕是个0k的,都不允许删除,但是咱是干嘛的?程序员啊,自己造方法,让他递归遍历删除!哼哼!
话不多说,上代码
function delDir(url){
let arr = fs.readdirSync(url);
if(arr.length > 0){//说明有文件
arr.forEach(item => {
let stat = fs.lstatSync(url + "/" + item);
let isDir = stat.isDirectory();
if(isDir){//是文件夹
delDir(url + "/" + item);
}else{
fs.unlinkSync(url + "/" + item);
}
})
}else{//说明没有文件
fs.rmdirSync(url);
}
if(fs.existsSync(url)){
fs.rmdirSync(url)
}
console.log('删除' + url + '成功')
}
8.删除文件
这个就很easy了
fs.unlinkSync(url);
9.复制文件
fs.copyFileSync('./1.json','./3.json');
就先写到这里吧,以后有方法再补充!以后可以来这里复制了,咯咯咯!