什么是fs(文件系统)文件系统在Node中,与文件的交互非常重要。服务端的本质是通过fs模块将本地文件发送给远程客户端Node,与文件系统进行交互该模块提供了一些标准的文件访问API,可以使用Node中的fs模块进行文件的打开、读取、写入等交互,constfs=require('fs')fs中的同步和异步fs模块中的所有操作都有两种操作模式,即同步和异步。同步文件系统会阻塞系统的执行,即除非操作完成,否则代码不会继续执行。异步文件系统不会阻塞程序的执行,但是当操作完成后,会通过回调函数将结果返回给fs。使用文件写手动打开文件同步的操作步骤:fs.openSync(path[,flags[,mode]])path:要打开的文件的路径flags:打开要进行的操作类型文件(后面会详细介绍更多操作类型)r:只读w:可写a:追加模式:可选值,是设置文件的操作权限,一般不通过方法返回一个文件描述符因此,通过它我们可以异步的对文件进行各种操作:fs.open(path[,flags[,mode]],callback)callback:两个返回参数err:错误对象,如果没有则为nullfa:文件的描述符向文件写入内容同步:fs.writeSync(fd,string[,position[,encoding]])fd:文件的描述符,需要传递要写入的描述字符串:内容待写位置:一般不写,表示开始写的位置closethefilefs.closeSync(fd)fd:待关闭文件的描述符fs.close(fd[,callback])//同步写入文件constfs=require('fs')//openFileletfd=fs.openSync('demo.txt','w')//写入文件fs.writeSync(fd,"仙剑奇侠传3")//关闭文件fs.closeSync(fd)//异步写入文件constfs=require('fs')//打开文件fs.open('demo2.txt','w',function(err,fd){if(!err){//写入文件fs.write(fd,'爱情公寓',function(err){if(!err){console.log('写入成功')}//关闭文件fs.close(fd,function(err){if(!err){console.log('Thefilewassavedandclosed')}})})}else{console.log('Somethingwentwrong')}})simplefilewritesynchronous:fs.writeFileSync(file,data[,options])asynchronous:fs.writev(fd,buffers[,position],callback)file:需要操作的文件路径data:需要写入的数据options:optional,可以对写入进行一些设置,它是一个对象,有三个值encoding:encodingdefault'utf8'mode:文件权限。默认0o666flag:文件是只读还是可写。默认'w'(更多操作类型下面会详细介绍)回调:写入完成后,执行//简单文件写入constfs=require('fs')//异步fs.writeFile('demo3.txt','景天与雪见',function(err){if(!err){console.log('写入成功')}})//同步fs.writeFileSync('demo4.txt','子轩与徐长青')流式文件写入有同步、异步之分,简单的文件写入不适合大文件写入,所以就有了流式文件写入的用法:创建可写流,fs.createWriteStream(path[,options])//流式文件写入constfs=require('fs')//创建一个可写流letws=fs.createWriteStream('demo.txt')//通过ws输出文件中的内容ws.write("Contentwrittenthroughwritablestream")//关闭流,不能使用ws.close(),否则文件不会被传输ws.end()flag:文件操作的类型有哪些r:读取文件,文件不存在然后发生异常r+:读写文件,如果文件不存在,则抛出异常rs:以同步方式打开文件进行读取rs+:以同步方式打开文件进行读写w:以写入方式打开文件,如果不存在则创建存在,存在则截断,覆盖所有截断wx:写打开文件,存在则打不开w+:读写打开文件,不存在则创建,存在则截断wx+:以读写方式打开文件,存在则打开失败a:以追加方式打开文件,不存在则创建ax:以追加方式打开文件,路径存在则失败a+:以读方式打开文件,不存在则优化然后创建ax+:打开文件进行读取和追加,如果路径存在则失败文件读取简单文件读取同步:fs.readFileSync(path[,options])异步:fs.readFile(path[,options],callback)callback(err,data)err:错误对象data:读取的数据是一个Buffer,为什么是Buffer?因为读取的不一定是字符串,可能是图片、音频等,Buffer更通用。对于字符串,可以使用toString读取数据//简单的文件读取constfs=require('fs')fs.readFile('demo.txt',function(err,data){if(!err){console.log(data)console.log(data.toString())}})流式文件读取也适用于大文件用法:fs.createReadStream(path[,options])//流式读取文件constfs=require('fs')//创建可读流letrs=fs.createReadStream('demo.txt')//要读取可读流中的数据,可读流必须绑定一个数据事件,数据事件绑定完成时,它会自动读取数据rs.on('data',function(data){console.log(data)console.log(data.toString())})//如果我们要将读取到的数据写入另一个fileletws=fs.createWriteStream('demo1.txt')//使用pipe(管道),会直接输入到wsrs.pipe(ws)
