Node文件系统—fs模块
3.1、readdirSync() 同步读取目录
同步调用会阻塞代码的执行,直到当前程序执行完成,才会往下执行。
语法:fs.readdirSync(path)
; path(必选项),表示要读取的路径。
如果同步代码遇到了错误,后面的代码是不会继续进行的。因而我们想到一种办法,不仅能在关键位置捕获错误信息,同时不妨碍程序的正常执行。
上面出现的情况是程序同步执行出现了错误,try catch 可以帮我们规避错误带来的不好影响,而不会使程序出错中断,以便我们更好的修改代码。
不过在异步操作中,遵循错误优先原则:
这里结果是打印 “读取错了”,因为./demo是个文件夹,应该用readdir()方法。
3.2、readdir() 异步读取目录
异步则不会阻塞代码的执行。
异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调。
语法:fs.readdir(path,options,callback(err,files))
- path(必选),表示要读取的路径。
- options(可选)参数。
- callback 是回调函数,第一个err错误信息,data成功内容
注意:在node的异步操作当中,有错误的回调优先原则。
3.3、mkdir() 创建目录
- mkdirSync() 同步创建目录
- mkdir() 异步创建目录
语法:fs.mkdir(path,[mode],[callback(err)])
注意不能创建一个已存在的文件夹。
- path(必选),表示创建的目录。
- mode(可选),表示创建模式。
- callback 是回调函数,err错误信息
3.4、rename() 修改名字
语法:fs.rename(oldpathname,newname,callback(err))
- oldpathname(必选),修改的文件路径。
- newname(必选)新名字。
- callback 是回调函数,err错误信息
3.5、rmdir() 删除目录
注意:只能删除空文件夹。
var fs = require("fs");
fs.rmdir('./test', function(err) {
if (err) {
console.error(err);
} else{
console.log("文件删除成功!");
}
});
3.6、writeFile() 异步写入
语法:fs.writeFile(filename, data, [options], callback)
- filename 文件名。
- data 要往文件里写的内容,可以是字符串。
- options 可选参数 encoding 编码,默认是utf-8。
- callback 回调方法
* 往文件里异步写数据,写入的内容可以是字符串,也可以是二进制数据。
* 如果文件不存在,则创建;如果文件已存在,那么内容会被覆盖
* @param {String} filename 文件名
* @param {String|Buffer} data 要往文件里写的内容,可以是字符串,也可以是二进制数据。当为二进制数据时候,options.encoding 会被忽略
* @param {Object} [options]
* @param {String} options.encoding 编码,默认是utf8
* @param {Number} options.mode=438 模式
* @param {String} options.flag=w 写文件的模式
* @param {Function} callback 回调方法
3.7、readFile() 异步读取
语法:fs.readFile("filename","encoding",[callback(err,data)])
- filename(必选),表示要读取的文件名。
- encoding(可选),表示文件的字符编码。
- callback 是回调函数,用于接收文件的内容。err错误信息,data请求内容。
3.8、unlink() 异步删除
var fs = require("fs");
console.log("准备删除文件!");
fs.unlink('input.txt', function(err) {
if (err) {
console.error(err);
console.error(“删除失败”);
}
console.log("文件删除成功!");
});
3.9、扩展知识—回调地狱
什么是回调函数?
是必须得依赖另一个函数执行调用,它是异步执行的,也就是需要时间等待。典型的例子就是Ajax应用。
什么是回调地狱?
函数作为参数层层嵌套。
在node, 由于非阻塞I/O的特性,node中经常会产生回调地狱,而且回调地狱产生之后会导致代码可读性非常差。
3.10、扩展知识—promise对象
解决回调地狱的方式:promise asys/awiat 蓝鸟插件…
蓝鸟插件,是以前用的,了解一下就好;现在是promise asys/await的天下。
Promise对象简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作);Promise对象,可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
简答:什么是异步?
异步操作多了,容易造成回调地狱这个问题。回调地狱简单来讲,是回调函数层层嵌套。
在node里面,异步特别多。因为在node里面,讲究的是单线程,非阻塞时IO,基本上任何操作都是异步来执行。既然是异步,就会有很多的回调函数,就容易造成回调地狱。
那什么是异步?
首先异步操作时,在node里面使用的特别多。因为node里讲究单线程、非阻塞IO、事件驱动,所以有大量的异步回调,那么异步回调层层嵌套之后就容易造成回调地狱,导致当前代码可读性变得非常差。所以在我的项目中,一旦出现了异步操作,我会使用promise来解决异步。promise中有resolve和reject,分别是当成功、失败时执行相关的操作。当然,同步情况也会出现,不过在使用同步进行操作时我会带上try catch来预先判别下错误,防止当前程序崩溃。
3.11、扩展知识—promise异步操作封装
例子:封装一个异步删除。
当然也可以将这个异步删除操作单独封装到一个文件里面,暴露出来,在别的文件里面导入使用。
可以直接module.exports=del导出,也可以用对象的形式暴露:
module.exports={
del //del:del键名、键值一样,简写版
}
总结
简单讲述了node问价系统fs模块的一些方法:有
>>常用的:
mkdirSync() 同步创建目录
mkdir() 异步创建目录
readdirSync() 同步读取目录
readdir() 异步读取目录
readFileSync() 同步读取文件
readFile() 异步读取文件
rename() 修改名字
rmdir() 异步删除目录
unlink() 异步删除文件
writeFile() 异步写入
>>另外没有介绍到的,大家有兴趣的可以看下:
fs.stat 检测是文件还是目录(目录 文件是否存在)
fs.appendFile 写入追加文件
fs.existsSync('test/test')判断文件夹是否存
//fs.existsSync存在的合理性在于,在用fs.writeFile的时候,需要先判断文件夹是否存在,
//因为fs.writeFile方法必须在存在的文件夹之下才能创建并写入文件成功