Node.js中文件系统fs模块的使用及常用接口


Posted in Javascript onMarch 06, 2020

Node.js中文件系统fs模块的使用及常用接口

fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。但是,这个模块几乎对所有操作提供异步和同步两种操作方式,供开发者选择。

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

结果

Node.js中文件系统fs模块的使用及常用接口

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

wwwroot 文件夹下面有 images css js 以及 index.html, 找出 wwwroot 目录下面的所有的目录,然后放在一个数组中

使用同步方法方式

const fs = require('fs')
const path = './wwwroot'
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 = './wwwroot'
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 ,把它复制到 /wwwroot/images 中

Node.js中文件系统fs模块的使用及常用接口

代码如下

const fs = require("fs")

const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')

readStream.pipe(writeStream)

需要特别注意的是, fs.createWriteStream 要写入的目录一定要带上要复制的文件名,也就是不能写成 fs.createWriteStream('./wwwroot/images/') 否则在 macOS 下会报如下错误:

Error: EISDIR: illegal operation on a directory, open <directory>

本文源码: https://github.com/dunizb/CodeTest/tree/master/Node/fs

总结

到此这篇关于Node.js中fs模块的使用及常用接口的文章就介绍到这了,更多相关node.js fs 模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JQUERY复选框CHECKBOX全选,取消全选
Aug 30 Javascript
使用javascript获取flash加载的百分比的实现代码
May 25 Javascript
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
html页面显示年月日时分秒和星期几的两种方式
Aug 20 Javascript
使用js简单实现了tree树菜单
Nov 20 Javascript
JQuery性能优化的几点建议
May 14 Javascript
微信小程序开发(一) 微信登录流程详解
Jan 11 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
基于Cookie常用操作以及属性介绍
Sep 07 Javascript
Vue表单及表单绑定方法
Sep 04 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
Oct 16 Javascript
如何正确理解vue中的key详解
Nov 02 Javascript
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 #Javascript
JS实现网页端猜数字小游戏
Mar 06 #Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 #Javascript
JavaScript canvas基于数组生成柱状图代码实例
Mar 06 #Javascript
vue 使用 canvas 实现手写电子签名
Mar 06 #Javascript
Vue Router 实现动态路由和常见问题及解决方法
Mar 06 #Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 #Javascript
You might like
PHP代码审核的详细介绍
2013/06/13 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
js数组去重的方法总结
2019/01/18 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python3实现定时任务的四种方式
2019/06/03 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
Python调用C语言程序方法解析
2020/07/07 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
出纳担保书范文
2014/04/02 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis