当前位置: 首页 > 后端技术 > Node.js

【节点文件系统fs模块】

时间:2023-04-03 15:05:48 Node.js

环境:Nodev8.2.1;Npmv5.3.0;OSWindows101,fs模块APInodejs的大部分API都提供了文件操作的同步和异步方法。下面是异步API结构如图,同步方法只需要在异步方法后面加上[Sync]即可1.1API结构图1.2文件读写方式对应代码2.一些例子下面是一些API的例子,以及一些API的简单代码实现2.1readFile读取文件//readFile(filename,[options],callback);/***filename,requiredparameter,filename*[options],optionalparameter,flagcanbespecified(文件操作选项,如r+读写;w+读写,如果文件不存在则创建)和编码属性*callback读取文件后的回调函数,参数默认为第一个err,第二个数据data*/constfs=require("fs");fs.readFile('./package.json',{flag:"r+",encoding:"utf8"},(err,data)=>{if(err)throwerr;console.log(data);})2.2writeFile写入文件//fs.writeFile(filename,data,[options],callback);/***文件名,必填参数,文件名*数据,写入的数据,可以是字符或Buffer对象*[options],flag,mode(permission),encoding*callback读取文件后的回调函数,参数默认为第一个err,第二个datadata*/constfs=要求(“fs”);常量数据=“你好世界”;常量bf=缓冲区。from(data);//bufferwritefs.writeFile("./test.txt",bf,err=>{if(err)throwerr;console.log("writesuccessful");})//写入字符进入fs.writeFile("./test.txt",data,err=>{如果(错误)抛出错误;console.log("Writesuccessful");})2.3追加写入文件//fs.appendFile(filename,data,[options],callback);constfs=require("fs");constdata="helloworld";constbf=Buffer.from(data);//bufferfs.appendFile("./test.txt",bf,err=>{if(err)throwerr;console.log("追加成功");})fs.appendFile("./test.txt",data,err=>{if(err)throwerr;console.log("追加成功");})2.4open打开文件打开文件并获取文件description//fs.open(filename,flags,[mode],callback);/***文件名,必填参数,文件名*flags,操作标志,如"r",读取模式open*[mode],权限,如777,表示任何用户都可以读写可执行的*callback打开文件后的回调函数,参数默认第一个err,第二个fd为整数,表示打开文件返回的文件描述符,也称为窗口中的文件句柄*/constfs=require("fs");fs.open("./test.txt","r",0666,(err,fd)=>{if(err)throwerr;控制台日志(fd);//3})【0666】是【文件权限码】,也可以在【fs.constants】中输出2.5读文件,将打开文件的内容读入缓冲区//fs.read(fd,buffer,offset,length,position,callback);/***fd,fs.open打开成功后返回的文件描述符*buffer,Buffer对象,v8引擎分配的一段内存*offset,Integer,写入缓冲区此时的初始位置,单位为bytes*length,integer,读取文件的长度*position,integer,读取文件的初始位置;文件大小bytes*callback(err,bytesRead,buffer),read执行完成后回调函数,bytesRead实际读取的字节数,要读取的buffer对象*/constfs=require("fs");fs.open("./test.txt","r",(err,fd)=>{if(err)throwerr;letbf=Buffer.alloc(255);fs.read(fd,bf,0,9,0,(err,bytesRead,buffer)=>{if(err)throwerr;console.log(bytesRead);console.log(buffer.toString());})})2.6写file,将buffer中的数据写入fs.open打开的文件中//fs.write(fd,buffer,offset,length,position,callback);/***fd,使用fs打开成功后返回的文件描述符.open*buffer,一个Buffer对象,v8引擎分配的一段内存*offset,integer,从buffer读取时的初始位置,单位为bytes*length,integer,从buffer读取数据的字节数*position,整数,写入文件的初始位置;*callback(err,written,buffer),write操作完成后的回调函数,written实际写入的字节数,以及要读取的buffer对象*/constfs=require("fs");fs.open("./test.txt","w",(err,fd)=>{if(err)throwerr;letbf=Buffer.from("写入文件数据的内容");fs.write(fd,bf,0,bf.length,0,(err,bytesWritten,buffer)=>{if(err)抛出错误;console.log(bytesWritten);console.log(`写入内容:${buffer.toString()}`);})})2.7刷新缓冲区当使用fs.write写入文件时,操作系统将数据读入内存,然后将数据写入文件。当数据被读出时,并不代表数据已经被写入,因为有一部分可能还在内部缓冲区中因此,可以使用fs.fsync方法将内存中的数据写入文件;--刷新内存缓冲区;//fs.fsync(fd,[callback])/***fd,使用fs.open打开成功后返回的文件Descriptor*[callback(err,written,buffer)],写操作后的回调函数为完成,written实际写入的字节数,以及要从buffer读取的buffer对象*/constfs=require("fs");fs.open("./test.txt","a+",(err,fd)=>{if(err)throwerr;letbf=Buffer.from("IloveNode");fs.write(fd,bf,0,bf.length,0,(err,bytesWritten,buffer)=>{if(err)throwerr;fs.fsync(fd,(err)=>{});fs.close(fd,err=>{});})})2.8读取目录//使用fs.readdir读取目录,在其回调函数中重点关注files对象//fs.readdir(path,callback);/***path,读取目录的完整路径和目录名;*[callback(err,files)],读取目录后的回调函数;err错误对象,files数组,存放读取目录下的所有文件名*/constfs=require("fs"),path=require("path");fs.readdir(__dirname+"/../11filesystemfs",(err,files)=>{if(err)throwerr;files.forEach(file=>{letfilePath=path.normalize(__dirname+'/'+file);fs.stat(filePath,(错误,统计数据)=>{如果(stats.isFile()){console.log(filePath+'is:'+'file');}if(stats.isDirectory()){console.log(filePath+'is:'+'dir');}})})})3.流操作3.1创建读流//fs.createReadStream(path,[options])/***pathfilepath*[options]flags:指定文件操作,默认'r',读操作;encoding,指定读取流的编码;autoClose,读取完成后是否自动关闭,默认为true;start指定要读取的文件的起始位置;end指定文件的起始和结束位置*/constfs=require("fs");constrs=fs.createReadStream("./package.json",{flags:"r"});rs.on("open",fd=>console.log('开始读取文件'));rs.on('data',data=>{console.log(data.toString());})rs.on('end',function(){console.log('读取文件结束')});rs.on('close',function(){console.log('fileclose');});rs.on('error',function(err){console.error(err);});3.2创建写入流//fs.createWriteStream(path,[options])/***pathfilepath*[options]flags:指定文件操作,默认'w';encoding,指定读流编码;开始指定写入输入文件的位置*//*ws.write(chunk,[encoding],[callback]);*chunk,可以是Buffer对象或字符串,要写入的数据*[encoding],encoding*[callback],写入后回调*//*ws.end([chunk],[encoding],[callback]);*[chunk],待写入数据*[encoding],编码*[callback],写入后回调*/constfs=require("fs");constws=fs.createWriteStream("./test.txt",{flags:"w"})constbf=Buffer.from("ILoveNode");ws.on('open',function(){console.log('filestreamopen')});ws.on('close',function(){console.log('文件流关闭');});ws.on('error',function(err){console.error(err);});ws.write(bf,"utf8",(err,buffer)=>{console.log('writecompleted')})ws.end('再见');3.3使用stream复制文件Stream复制文件就是创建一个readstream和一个Write到stream,将readstream中流出的数据写入writestream//使用stream复制文件constfs=require("fs");constrs=fs.createReadStream("./package.json");constws=fs.createWriteStream("./package1.json");rs.on("data",data=>{ws.write(data);})ws.on('open',function(fd){console.log('要写入的数据文件已经打开,文件描述符为:'+fd);});rs.on("end",()=>{console.log('文件读取完成');ws.end('完成',()=>{console.log("文件写入完成");})})关于WriteStream对象write方法返回一个布尔类型。当缓冲区中的所有数据都已满时,返回false;表示缓冲区已满,将立即输出到目标对象。测试返回值示例:constfs=require("fs");varws=fs.createWriteStream(__dirname+'/test.txt',{flags:"w"});for(vari=0;i<10000;i++){varw_flag=ws.write(i.toString());//当缓冲区满时,输出falseconsole.log(w_flag);}一个例子当缓冲区中的所有数据都输出时,触发一个事件constfs=require("fs");常量rs=fs。createReadStream("./ABoy.mp3");constws=fs.createWriteStream("./ABoy1.mp3");rs.on("data",data=>{lett=ws.write(data);如果(!t){console.log(t);}})ws.on("drain",()=>{console.log('系统缓冲区的数据已经全部输出。')})3.4pipe用于stream使用读取流和写入流来复制文件。还有另一种方法可以在写流和读流之间建立管道。读取流中的数据通过管道的源头。不断流向写流,实现文件复制。constfs=require("fs");constrs=fs.createReadStream("./ABoy.mp3");constws=fs.createWriteStream("./ABoy1.mp3");rs.pipe(ws);rs.on('data',function(data){console.log('数据可读')});rs.on('end',function(){console.log('文件读取完成');});ws.on("drain",()=>{console.log('系统缓冲区中的数据已全部输出。')});ws.on('open',function(fd){console.log('要写入的数据文件已经打开,文件描述符为:'+fd);});CSDN【节点文件系统fs模块】同步更新