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

NodeBasics中的文件操作

时间:2023-04-03 20:44:44 Node.js

前面node中写的文件操作非常频繁,它有很多API,提供对文件和文件夹的各种操作。下面通过常用API的案例讲解来了解它们的具体用法。1、读取文件fs.readFile()、fs.readFileSync()fs文件操作基本上包括两种方法:同步和异步,这两种方法的说明会同时针对每个函数进行说明,这里不再赘述进入细节。异步fs.readFile(文件名,[可选参数,编码方式,例如'utf-8'],callback)fs.readFile('/Users/kekobin/node-dir-test/util.js',(err,buffer)=>{if(err)throwerr;console.log(buffer.toString())})callback回调包含err和buffer,默认不传编码方式,返回buffer二进制数据,但是它可以通过buffer.toString()转换成一个字符串。默认使用buffer的原因是二进制流占用内存少,传输和计算速度快,性能高。同步fs.readFileSync(文件名,[可选参数,编码方式,如'utf-8'])try{constbuffer=fs.readFileSync('/Users/kekobin/node-dir-test/util.js')}catch(e){}fs.readFile(),fs.readFileSync()会不断的将读取的内容缓冲到内存中,直到缓冲完整个文件,所以对于大量或者大文件的读取时,一般使用fs.createReadStream()用于流式传输以减少内存压力。两次写入文件fs.writeFile()fs.writeFileSync()异步fs.writeFile(文件名,写入内容,[可选参数,编码方式,如'utf-8'],回调)fs.writeFile('/Users/kekobin/node-dir-test/util.js','测试写入文件',(err)=>{if(err){console.log('写入文件失败');return;}console.log('写入文件成功');})callback回调只有err参数,表示是否写入成功。同步fs.writeFileSync(文件名,写入内容,[可选参数,编码方式,如'utf-8'])try{consterr=fs.writeFileSync('/Users/kekobin/node-dir-test/util.js','试写文件')}catch(e){}三创建文件夹fs.mkdir()fs.mkdirSync()异步fs.mkdir(filename,permission,callback)fs.mkdir('/Users/kekobin/node-dir-test/test-dir',0777,(err)=>{if(err){console.log('创建文件夹失败');return;}console.log('创建文件夹成功');})“权限”是指创建的文件夹是否可读、可写等。Syncfs.mkdirSync(filename,permission)try{consterr=fs.mkdirSync(''/Users/kekobin/node-dir-test/test-dir',0777)}catch(e){}4获取文件或文件夹statusfs.stat()fs.statSync()经常通过这两个API异步判断是文件还是文件夹fs.stat(文件名或文件夹名)fs.stat('/Users/kekobin/node-dir-test/test-dir',(err,stats)=>{if(err)throwerr;if(stats.isFile()){}if(stats.isDirectory()){}})callback参数stats是一个包含文件或文件夹信息的对象。最常用的是使用stats.isFile()判断是否是文件,使用stats.isDirectory()判断是否是文件夹。syncfs.statSync(filenameorfoldername)try{conststats=fs.statSync('/Users/kekobin/node-dir-test/test-dir')}catch(e){}由于fs.exists()有beendeprecated,所以判断一个文件或文件夹是否存在,也可以通过这两个API来判断,即读取一个文件夹,判断stats.isDirectory()是否为真。True表示存在,否则不存在。五读取目录readdir()、readdirSync()这两个API会返回一个包含文件和子目录的数组。异步fs.readdir(文件夹名称)constdir='/Users/kekobin/node-dir-test/';fs.readdir(dir,function(err,files){if(err){throwerr;return;}files.forEach((filename,index)=>{constfullname=path.join(dir,filename);fs.stat(fullname,(err,stats)=>{if(err)throwerr;if(stats.isDirectory()){}if(stats.isFile()){}})});});一般用于遍历文件夹、生成文件树等操作。同步fs.readdirSync(foldername)try{constfiles=fs.readdirSync(dir)}catch(e){}六创建文件读取流fs.createReadStream(filename)常用于打开大文本文件,创建A读操作的数据流。所谓大文本文件是指文本文件体积较大,无法加载到读操作的缓存中,只能分几次发送。每次发送都会触发一个数据事件,发送结束后会触发结束事件。letresult='';fs.createReadStream('/Users/kekobin/node-dir-test/util.js').on('data',(data)=>{result+=data;}).on('end',()=>{console.log('获取最终文件读取的内容',result);})创建文件写入流fs.createWriteStream(filename)创建写入数据流对象,对象的write方法用于写入数据,end方法用于结束写入操作。constout=fs.createWriteStream(fileName,{encoding:'utf8'});out.write(str);out.end();比如createWriteStream和createReadStream配合实现大文件的拷贝。functionfileCopy(filename1,filename2,done){varinput=fs.createReadStream(filename1);varoutput=fs.createWriteStream(filename2);input.on('data',function(d){output.write(d);});input.on('error',function(err){throwerr;});input.on('end',function(){output.end();if(done)done();});}//复制util.js到util2.jsfileCopy('/Users/kekobin/node-dir-test/util.js','/Users/kekobin/node-dir-test/util2.js',function(){console.log('end')})8删除文件fs.unlink()fs.unlinkSync()asynchronousfs.unlink(filename)fs.unlink('/Users/kekobin/node-dir-test/util2.js',function(err){if(err)throwerr;console.log('文件删除成功');});同步fs.unlinkSync(filename)try{fs.unlinkSync('/Users/kekobin/node-dir-test/util2.js')}catch(){}九删除目录fs.rmdir()fs.rmdirSync()异步fs.rmdir(文件夹名,回调)fs.rmdir('/Users/kekobin/node-dir-test/test-dir',function(err){if(err)throwerr;console.log('目录删除成功');});syncfs.rmdirSync(文件名)try{fs.rmdirSync('/我们ers/kekobin/node-dir-test/test-dir')}catch(){}示例:同步读取目录中的所有文件constgetFiles=function(dir){constresults=[];constfiles=fs.readdirSync(dir,'utf8');files.forEach(function(file){constfullname=path.resolve(dir,file);conststats=fs.statSync(fullname);if(stats.isFile()){results.push(fullname);}elseif(stats.isDirectory()){results=results.concat(getFiles(fullname));}});返回结果;};constfiles=getFiles('/Users/kekobin/node-dir-test/');本文收录在我的个人Githubhttps://github.com/kekobin/bl...如果觉得有帮助,欢迎点赞支持原创。未经本人同意请勿转载!