Node.js fs模块原理及常见用途
JavaScript的是没有操作文件的能力,但是Node是可以做到的,Node提供了操作文件系统模块,是Node中使用非常重要和高频的模块,是绝对要掌握的一个模块系统。
fs模块提供了非常多的接口,这里主要说一下一些常用的接口。
1.常用API快速复习
fs.stat检测是文件还是目录
constfs=require('fs') fs.stat('hello.js',(error,stats)=>{ if(error){ console.log(error) }else{ console.log(stats) console.log(`文件:${stats.isFile()}`) console.log(`目录:${stats.isDirectory()}`) } })
fs.mkdir创建目录
constfs=require('fs') fs.mkdir('logs',error=>{ if(error){ console.log(error) }else{ console.log('目录创建成功!') } })
fs.rmdir删除目录
constfs=require('fs') fs.rmdir('logs',error=>{ if(error){ console.log(error) }else{ console.log('成功删除了目录logs') } })
fs.writeFile创建写入文件
constfs=require('fs') fs.writeFile('logs/hello.log','您好~\n',error=>{ if(error){ console.log(error) }else{ console.log('成功写入文件'); } })
fs.appendFile追加文件
constfs=require('fs') fs.appendFile('logs/hello.log','hello~\n',error=>{ if(error){ console.log(error) }else{ console.log('成功写入文件'); } })
fs.readFile读取文件
constfs=require('fs') fs.readFile('logs/hello.log','utf-8',(error,data)=>{ if(error){ console.log(error) }else{ console.log(data); } })
fs.unlink删除文件
constfs=require('fs') fs.unlink(`logs/${file}`,error=>{ if(error){ console.log(error) }else{ console.log(`成功删除了文件:${file}`) } })
fs.readdir读取目录
constfs=require('fs') fs.readdir('logs',(error,files)=>{ if(error){ console.log(error) }else{ console.log(files); } })
fs.rename重命名,还可以更改文件的存放路径
constfs=require('fs') fs.rename('js/hello.log','js/greeting.log',error=>{ if(error){ console.log(error) }else{ console.log('重命名成功') } })
2.第三方npm包mkdirp的使用
mkdirp不仅可以创建文件夹,还可以创建多层的文件夹,类似mkdir-p命令
midir-ptmp/foo/bar/baz
上述命令也可以在当前目录创建多层几文件夹。
如下代码在当前目录生成多层级文件夹
constmkdirp=require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made=>console.log(`创建目录于:${made}`))
//创建目录于:/Users/zhangbing/github/CodeTest/Node/fs/tmp
3.实战举例
实战1
判断服务器上面有没有upload目录。如果没有就创建这个目录,如果有的话不做操作
constfs=require('fs') constpath='./upload' fs.stat(path,(err,data)=>{ if(err){ //执行创建目录 mkdir(path) return } if(data.isDirectory()){ console.log('upload目录存在'); }else{ //首先删除文件,再去执行创建目录 fs.unlink(path,err=>{ if(!err){ mkdir(path) } }) } }) functionmkdir(dir){ fs.mkdir(dir,err=>{ if(err){ console.log(err); return } }) }
实战2
wwwroot文件夹下面有imagescssjs以及index.html,找出wwwroot目录下面的所有的目录,然后放在一个数组中
使用同步方法方式
constfs=require('fs') constpath='./wwwroot' constdirArr=[] constdirs=fs.readdirSync(path) dirs.forEach(item=>{ if(fs.statSync(path+'/'+item).isDirectory()){ dirArr.push(item) } }) console.log('dirArr',dirArr) //dirArr['css','images','js']
使用async/await方式
constfs=require('fs') constpath='./wwwroot' constdirArr=[] functionisDir(path){ returnnewPromise((resolve,reject)=>{ fs.stat(path,(error,stats)=>{ if(error){ console.log(error) reject(error) return } if(stats.isDirectory()){ resolve(true) }else{ resolve(false) } }) }) } functionmain(){ fs.readdir(path,async(error,data)=>{ if(error){ console.log(error) return }else{ for(leti=0;i4.管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。
constfs=require("fs")
//创建一个可读流
constreaderStream=fs.createReadStream('input.txt')
//创建一个可写流
constwriterStream=fs.createWriteStream('output.txt')
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readerStream.pipe(writerStream)
console.log("程序执行完毕")
fs.createReadStream从文件流中读取数据
constfs=require('fs') constfileReadStream=fs.fileReadStream('demo1.js') letcount=0 letstr='' fileReadStream.on('data',chunk=>{ console.log(`${++count}接收到:${chunk.length}`) str+=chunk }) fileReadStream.on('end',()=>{ console.log('---结束---') console.log(count+','+star) }) fileReadStream.on('error',error=>{ console.log(error) })fs.createWriteStream写入文件
constfs=require("fs")
constdata='我是从数据库获取的数据,我要保存起来'
//创建一个可以写入的流,写入到文件output.txt中
constwriterStream=fs.createWriteStream('output.txt')
//使用utf8编码写入数据
writerStream.write(data,'UTF8')
//标记文件末尾
writerStream.end()
//处理流事件-->finish事件
writerStream.on('finish',()=>{
/*finish-所有数据已被写入到底层系统时触发。*/
console.log("写入完成。")
})
writerStream.on('error',err=>{
console.log(err.stack);
})
console.log("程序执行完毕")
实战:复制图片
在项目根目录有一张图片2020.png,把它复制到/wwwroot/images中
代码如下
constfs=require("fs")
constreadStream=fs.createReadStream('./2020.png')
constwriteStream=fs.createWriteStream('./wwwroot/images/2021.png')readStream.pipe(writeStream)
需要特别注意的是,fs.createWriteStream要写入的目录一定要带上要复制的文件名,也就是不能写成fs.createWriteStream('./wwwroot/images/')否则在macOS下会报如下错误:
Error:EISDIR:illegaloperationonadirectory,open
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。