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 相关文章推荐
JavaScript高级程序设计
Dec 29 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
Javascript中的方法和匿名方法实例详解
Jun 13 Javascript
JS获取url参数、主域名的方法实例分析
Aug 03 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
Nov 02 Javascript
JS设置随机出现2个数字的实例代码
Jul 19 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
PHP数组实例总结与说明
2011/08/23 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
python查看微信好友是否删除自己
2016/12/19 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
大学生村官工作感言
2014/01/10 职场文书
秘书英文求职信
2014/04/16 职场文书
产品售后服务承诺书
2014/05/21 职场文书
2015元旦标语横幅
2014/12/09 职场文书
工作自我评价范文
2015/03/05 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技