在 nodejs 中, fs 模块为我们提供了目录和文件的创建,删除,以及读写操作。同时操作文件提供了同步和异步的方式,例如:
读取文件的内容的函数
同步:fs.readFileSync(path[, options])
异步:fs.readFile(path[, options], callback)
但是在实际的开发中,我们更多的还是使用异步来进行开发,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
注意,在使用fs模块前,必须要先导入此模块
const fs = require('fs');
操作文件
1、文件的写入
const fs = require('fs');
fs.writeFile('./test.txt','this is a test',function(err){
if(err) throw err;
})
这里传入的第一个参数,如果存在该文件,就会将第二个参数的内容写进去(如果里面有内容,会被覆盖,并不是增加,如果要增加,后面的方法会说到);如果不存在该文件,则会自动创建该文件并写入第二个参数的内容
2、文件的追加
const fs = require('fs');
fs.appendFile('./test.txt','hello,nodejs',function(err){
if(err) throw err;
})
这里是对 test.txt 文件的内容追加
3、文件的读取
const fs = require('fs');
fs.readFile('./test.txt',function(err,data){
if(err) throw err;
console.log(data.toString());
})
//<Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74 68 65 6c 6c 6f 2c 6e 6f 64 65 6a 73>
这里要注意,返回的文件内容是 Buffer 类二进制数据流,需要使用toString() 方可看到真是内容,或者在第一个参数后面再添加一个参数:’ utf8 ’
4、文件的复制
const fs = require('fs');
fs.copyFile('./test.txt','./test2.txt',(err)=>{
if(err) throw err
})
这里会将 test.txt 中的内容复制到 test2.txt 中
5、文件的删除
const fs = require('fs');
fs.unlink('./test.txt',(err)=>{
if(err) throw err;
})
6、获取文件信息
const fs = require('fs');
fs.stat('./test.txt',(err, status)=>{
if(err) throw err;
console.log(status); //拿到一个文件的具体信息
});
拿到文件信息对象后,下面有两个方法比较常用:
- isFile:判断是否为文件
- isDirectory:判断是否为目录
操作目录
1、目录的创建
const fs = require('fs');
fs.mkdir('./demo',(err)=>{
if(err) throw err;
})
这里就在同一级上创建了一个名为 demo 的目录
2、目录的读取
const fs = require('fs');
fs.readdir('./',(err,files)=>{
if(err) throw err;
console.log(files);
})
这里需要注意的是,files 是以一个数组的形式输出 ./ 下一级的所有文件或目录,无法获取更深一层的文件或目录
那么如何去读取一个目录里面所有的文件?
这里需要使用到递归。首先判断当前项目是否为文件,如果是文件,打印出来,如果是目录继续递归进入目录,继续进行判断,代码如下:
const fs = require('fs');
const path = require('path'); // nodejs 里面的一个内置,专门处理路径相关
const showFile = function(dir){
// 首先第一步,通过 fs.readdir 方法来读取这个目录
fs.readdir(dir,(err,files)=>{
if(err) throw err;
files.forEach(file=>{
// 首先要获取到该文件的绝对路径
let filedir = path.join(dir,file);
fs.stat(filedir,(err,stat)=>{
if(err) throw err;
if(stat.isFile()){
// 如果进入到 if,说明是文件,那么直接打印出来
console.log(file);
} else {
// 如果进入到 else,说明是目录,继续调用函数
showFile(filedir);
}
})
})
})
}
showFile('./');
3、目录的删除
//这里全都是使用了同步的函数
function deleteDir(dir) {
let files = fs.readdirSync(dir) //读取目录demo,得到数组files
files.forEach(function (file) {
let filedir = path.join(dir, file);
let stat = fs.statSync(filedir) //得出node中的内容的各个状态
if (stat.isFile()) {
fs.unlinkSync(filedir, (err) => { //进入if,说明是文件,删除
if (err) throw err;
})
}
else {
deleteDir(filedir); //进入else,说明是目录,继续调用函数
}
})
fs.rmdirSync(dir); //一层一层的删除空目录
}
deleteDir('./demo');
注意:目录里面如果有文件,系统是不允许你删除的,也就是说,只能删除空目录,所以这里又会用到递归
以上只是提供了一些常用的 fs 文件系统中的函数,fs 还有很多函数,具体可参见:fs 文件系统