Node.js fs模块原理及常见用途
JavaScript 的是没有操作文件的能力, Node 是可以做到的,Node 提供了操作文件系统模块,是 Node 中使用非常重要和高频的模块,是绝对要掌握的一个模块系统。
fs 模块提供了非常多的接口,这里主要说一下一些常用的接口。
1.常用API快速复习
fs.stat 检测是文件还是目录
const fs = 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 创建目录
const fs = require('fs') fs.mkdir('logs', error => { if(error) { console.log(error) } else { console.log('目录创建成功!') } })
fs.rmdir 删除目录
const fs = require('fs') fs.rmdir('logs', error => { if(error) { console.log(error) } else { console.log('成功删除了目录 logs') } })
fs.writeFile 创建写入文件
const fs = require('fs') fs.writeFile('logs/hello.log','您好~\n', error => { if(error) { console.log(error) } else { console.log('成功写入文件'); } })
fs.appendFile 追加文件
const fs = require('fs') fs.appendFile('logs/hello.log','hello~\n', error => { if(error) { console.log(error) } else { console.log('成功写入文件'); } })
fs.readFile 读取文件
const fs = require('fs') fs.readFile('logs/hello.log','utf-8', (error, data) => { if(error) { console.log(error) } else { console.log(data); } })
fs.unlink 删除文件
const fs = require('fs') fs.unlink(`logs/${file}`, error => { if(error) { console.log(error) } else { console.log(`成功删除了文件 ${file}`) } })
fs.readdir 读取目录
const fs = require('fs') fs.readdir('logs', (error, files) => { if(error) { console.log(error) } else { console.log(files); } })
fs.rename 重命名,还可以更改文件的存放路径
const fs = 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 -p tmp/foo/bar/baz
上述命令也可以在当前目录创建多层几文件夹。
如下代码在当前目录生成多层级文件夹
const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then(made => console.log(`创建目录于 ${made}`))
// 创建目录于 /Users/zhangbing/github/CodeTest/Node/fs/tmp
3.实战举例
实战1
判断服务器上面有没有 upload 目录。如果没有就创建这个目录,如果有的话不做操作
const fs = require('fs') const path = './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) } }) } }) function mkdir(dir) { fs.mkdir(dir, err => { if(err) { console.log(err); return } }) }
实战2
root 文件夹狼蚁网站SEO优化有 images css js 以及 index.html, 找出 root 目录狼蚁网站SEO优化的所有的目录,然后放在一个数组中
使用同步方法方式
const fs = require('fs') const path = './root' const dirArr = [] const dirs = 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 方式
const fs = require('fs') const path = './root' const dirArr = [] function isDir(path) { return new Promise((resolve, reject) => { fs.stat(path, (error, stats) => { if(error) { console.log(error) reject(error) return } if(stats.isDirectory()) { resolve(true) } else { resolve(false) } }) }) } function main(){ fs.readdir(path, async (error, data) => { if(error) { console.log(error) return } else { for(let i = 0; i < data.length; i++) { if(await isDir(path + '/' + data[i])) { dirArr.push(data[i]) } } console.log('dirArr', dirArr) } }) } main() // dirArr [ 'css', 'images', 'js' ]
4.管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到一个流中。以下实例我们通过读取一个文件内容并将内容写入到一个文件中。
const fs = require("fs")
//创建一个可读流
const readerStream = fs.createReadStream('input.txt')
//创建一个可写流
const writerStream = fs.createWriteStream('output.txt')
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readerStream.pipe(writerStream)
console.log("程序执行完毕")
fs.createReadStream 从文件流中读取数据
const fs = require('fs') const fileReadStream = fs.fileReadStream('demo1.js') let count = 0 let str = '' 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 写入文件
const fs = require("fs")
const data ='我是从数据库获取的数据,我要保存起来'
//创建一个可以写入的流,写入到文件output.txt中
const writerStream = 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,把它复制到 /root/images 中
代码如下
const fs = require("fs")
const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./root/images/2021.png')readStream.pipe(writeStream)
需要特别注意的是,fs.createWriteStream 要写入的目录一定要带上要复制的文件名,也就是不能写成 fs.createWriteStream('./root/images/') 否则在 macOS 下会报如下错误
Error: EISDIR: illegal operation on a directory, open <directory>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程