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 相关文章推荐
使用js检测浏览器的实现代码
May 14 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
jquery使用经验小结
May 20 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
vue弹窗组件的实现示例代码
Sep 10 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
Apr 04 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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里的JS打印函数
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
基于python的字节编译详解
2017/09/20 Python
Python get获取页面cookie代码实例
2018/09/12 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python读写锁实现实现代码解析
2020/11/28 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
大学毕业生管理学求职信
2014/09/01 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL