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

Node.js文件和目录操作示例

时间:2023-04-03 17:50:06 Node.js

文件打开和关闭fs.open(path.resolve("data.txt"),"r",(err,fd)=>{console.log(fd);//3});fs.open("data.txt","r",(err,fd)=>{console.log(fd);fs.close(fd,(err)=>{console.log('关闭成功');});});大文件读写操作涉及打开和写入两种方法//read读取操作是将磁盘文件中的数据写入缓冲区//read(fd:number,--locate当前打开的文件//buffer:Buffer,--用于标识当前缓冲区//offset:number,--从缓冲区中的哪个位置开始写入//length:number,--当前写入的字节长度//position:fs.ReadPosition,--从磁盘文件开始读取哪个字节//callback:(err:NodeJS.ErrnoException,bytesRead:number,buffer:Buffer)=>void):voidletbuf=Buffer.alloc(10);fs.open("data.txt","r",(err,readfd)=>{console.log(readfd);fs.read(readfd,buf,1,3,2,(err,readBytes,data)=>{console.log(readBytes);console.log(data);console.log(data.toString());});});//write(fd:number,--定位当前打开的文件//buffer:Buffer,--用于标识当前缓冲区//offset:number,--从缓冲区开始读取数据的位置//llength:number,--当前写入的字节长度//position:number,--从哪个字节开始写入//callback:(err:NodeJS.ErrnoException,written:number,buffer:Buffer)=>void):voidletbuf=Buffer.from('1234567890')fs.open('a.txt','w',(err,writefd)=>{fs.write(writefd,buf,1,3,0,(错误,written,buffer)=>{console.log(written)//3console.log(buffer)//console.log(buffer.toString())//1234567890fs.close(writefd)})})文件复制自定义实现/***1打开文件a,使用read将数据保存到buffer暂存--文件a的内容为1234567890*2,打开文件b,使用write将buffer中的数据写入文件b*/letbuf=Buffer.alloc(10);//打开指定文件fs.open("a.txt","r",(err,readfd)=>{//打开b文件进行数据写入操作fs.open("b.txt","w",(err,writefd)=>{//从打开的文件中读取数据fs.read(readfd,buf,0,10,0,(err,readBytes)=>{//将缓冲区写入b.txtfs.write(writefd,buf,0,10,0,(err,wirtten)=>{console.日志(“写successful");});});});});对于大文件同时读写,使用缓冲buffer完成操作letbuf=Buffer.alloc(10);constBUFFER_SIZE=buf.length;letreadOffset=0;fs.open("a.txt","r",(err,readfd)=>{fs.open("b.txt","w",(err,writefd)=>{functionnext(){fs.read(readfd,buf,0,BUFFER_SIZE,readOffset,(err,readBytes)=>{if(!readBytes){//如果条件为真,则内容已读取fs.close(readfd,()=>{});fs.close(writefd,()=>{});console.log("复制完成");返回;}readOffset+=readBytes;fs.write(writefd,buf,0,readBytes,(err,written)=>{next();//递归读写});});}next();});});FS目录操作APIaccess判断文件或目录是否有操作权限stat获取目录和文件信息mkdir创建目录rmdir删除目录readdir读取目录内容unlink删除指定文件fs.access("a.txt",(err)=>{if(err){console.log(呃);}else{控制台。log("有操作权限");}});fs.stat("a.txt",(err,statObj)=>{console.log(statObj.size);//14console.log(statObj.isFile());//trueconsole.log(statObj.isDirectory());//错误});fs.mkdir("a/b/c",(err)=>{if(!err){console.log("创建成功");}else{console.log(err);//报错此时,只有当a/b存在时,才必须创建c}});fs.mkdir("a/b/c",{recursive:true},(err)=>{//递归创建,无需保证a/b目录存在if(!err){console.log("createsuccessful");}else{console.log(err);//此时报错,确保a/b存在,才能创建c}});fs.rmdir("a/b/c",(err)=>{//当a/b/c存在时,只删除c。默认情况下,只删除非空目录if(!err){console.log("删除成功");}else{console.log(err);}});fs.rmdir("a",{recursive:true},(err)=>{//递归删除if(!err){console.log("deletesuccessful");}else{console.log(err);}});fs.readdir("a",(err,files)=>{console.log(files);//['a.txt','b']默认只检查第一层,结果为数组});fs.unlink("a/a.txt",(err)=>{if(!err){console.log("删除成功");}});目录创建的同步实现/***1以后调用的时候需要接收一个类似于a/b/c的路径,并且只用/来连接它们*2使用/分隔符来分割路径,将每一项放入一个数组中进行管理['a','b','c']*3遍历上面的数组,我们需要得到每一项,然后与前一项进行拼接*4判断是否是后路径当前拼接有可操作权限。如果存在,则证明存在,否则需要创建*/functionmakeDirSync(dirPath){letitems=dirPath.split(path.sep);控制台日志(项目);//['a','b','c']for(leti=1;i<=items.length;i++){//这里从下标1开始letdir=items.slice(0,i).join(path.sep);控制台日志(目录);尝试{fs.accessSync(dir);}catch(err){fs.mkdirSync(dir);}}}makeDirSync("a\\b\\c");目录创建异步实现函数mkDir(dirPath,cb){letparts=dirPath.split("/");让指数=1;functionnext(){if(index>parts.length){returncb&&cb();}让当前=部分。切片(0,索引++)。加入(”/”);飞秒。访问(当前,(错误)=>{if(err){//无操作权限fs.mkdir(current,next);}else{下一个();}});}next();}mkDir("a/b/c",()=>{console.log("创建成功");});使用es6方式实现,需要使用util包中的promiseifyconst{promisify}=require("util");//asyncstyleconstaccess=promisify(fs.access);将access和mkdir处理交给你constmkdir=promisify(fs.mkdir);异步函数myMkdir(dirPath,cb){letparts=dirPath.split("/");for(letindex=1;index<=parts.length;index++){letcurrent=parts.slice(0,index).join("/");尝试{等待访问(当前);}catch(error){awaitmkdir(current);}}cb&&cb();}myMkdir("a/b/c",()=>{console.log("创建成功");});目录删除的异步实现/***需求:我儿子,你有个函数接收A路径,然后执行删除操作*1,判断当前传入路径是否是文件,直接删除当前文件*2,如果当前传入路径是目录,我们需要继续读取目录内容,然后再执行删除操作*3、将删除行为定义为一个函数,然后递归复用*4、将当前名称拼接成删除时可以使用的路径*/乐趣ctionmyRmDir(dirpath,cb){//判断当前dirpath类型fs.stat(dirpath,(err,statObj)=>{if(statObj.isDirectory()){//目录,继续读取fs.readdir(dirpath,(err,files)=>{letdirs=files.map((item)=>path.join(dirpath,item));console.log(dirs);letindex=0;functionnext(){if(index===dirs.length){returnfs.rmdir(dirpath,cb);//遍历完成,删除最外层目录}letcurrent=dirs[index++];myRmDir(current,next);}next();});}else{//file--直接删除fs.unlink(dirpath,cb);}});}myRmDir("a.txt",()=>{//fileconsole.log("delsuccessful");});myRmDir("a",()=>{//目录console.log("delsuccessful");});