Node.js程序中的本地文件操作用法小结


Posted in Javascript onMarch 06, 2016

Node最引以为傲的就是它有一个非常小的核心。有一些语言绑定了完整的POSIX API,而 Node实现了尽可能少的绑定,并通过同步、异步或流API形式暴露他们。

这种方法意味着,操作系统中有一些非常方便的功能,需要在Node中重建。这是一个教你如何使用文件系统软件包的实用教程。

引用文件
与文件系统的交互很重要的一点是要指向正确的文件。由于NPM的包使用相对路径引用,所以你不能把路径写死在代码。有两个主要方式来以确保包能引用到正确的文件:

// 使用 `path.join()` 而不是 `+` 确保Windows也能正常工作
const path = require('path')

// 找到基于调用点的相对路径,对于命令行程序(CLI applications)非常实用
path.join(process.cwd(), 'my-dynamic-file')
// 或者
path.resolve('my-dynamic-file')

// 基于一个文件找到另外一个文件
path.join(__dirname, 'my-package-file')

读取文件
在节点中的异步读取文件的最简单方法就是使用流!下面是一个例子:

const path = require('path')
const fs = require('fs')

// read a file and pipe it to the console
fs.createReadStream(path.join(__dirname, 'my-file'))
 .pipe(process.stdout)

创建文件
创建文件也并不是很难,这里有一个用node实现的cat命令:

const path = require('path')
const fs = require('fs')

// cat ./my-file > ./my-other-file
fs.createReadStream(path.join(__dirname, 'my-file'))
 .pipe(fs.createWriteStream(path.join(__dirname, './my-other-file')))

删除文件
在Shell脚本中删除的文件和目录通常使用 rm-rf 命令。NodeJS中一个 rimraf 也实现了相同的功能:

const rimraf = require('rimraf')
const path = require('path')

rimraf(path.join(__dirname, './my-directory'), err => {
 if (err) throw err
})


创建目录
创建跟删除文件很相似,使用 mkdirp 包

const mkdirp = require('mkdirp')
const path = require('path')

mkdirp(path.join(__dirname, 'foo/bar'), err => {
 if (err) throw err
})

查找文件
使用 readdirp 查找当前目录下的文件:

const readdirp = require('readdirp')
const json = require('JSONStream')
const path = require('path')

// recursively print out all files in all subdirectories
// to the command line. The object stream must be
// stringified before being passed to `stdout`.
readdirp({ root: path.join(__dirname) })
 .pipe(json.stringify())
 .pipe(process.stdout)

使用findup查找当前父级目录中的文件:

const findup = require('findup')
const path = require('path')

// recurse up all files relative to __dirname and find
// all `package.json` files.
findup(path.join(__dirname), 'package.json', (err, res) => {
 if (err) throw err
 console.log('dir is: ' + res)
})

关于管道(pipes)

在管道中对整个数据流的错误进行一次处理非常。而不用对每个单独的数据流使用 .on('error', cb) :

const pump = require('pump')
const fs = require('fs')

// oh no, no errors are handled!
fs.createReadStream('./in.file').pipe(fs.createWriteStream('./out.file'))

// that's better, we're handing errors now
const rs = fs.createReadStream('./in.file')
const ws = fs.createWriteStream('./out.file')
pump(rs, ws, err => {
 if (err) throw err
})

Javascript 相关文章推荐
JS实现页面进入和返回定位到具体位置
Dec 08 Javascript
移动端脚本框架Hammer.js
Dec 15 Javascript
canvas绘制多边形
Feb 24 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
详解vue中axios的封装
Jul 18 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
JavaScript工具库MyTools详解
Jan 01 Javascript
Vue如何提升首屏加载速度实例解析
Jun 25 Javascript
JSON获取属性值方法代码实例
Jun 30 Javascript
JavaScript实现数据类型的相互转换
Mar 06 #Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 #Javascript
javascript实现label标签跳出循环操作
Mar 06 #Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 #Javascript
JavaScript实现图片滑动切换的代码示例分享
Mar 06 #Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 #Javascript
AngularJS页面访问时出现页面闪烁问题的解决
Mar 06 #Javascript
You might like
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
react redux入门示例
2018/04/19 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
vue如何截取字符串
2019/05/06 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
javascript实现时钟动画
2020/12/03 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
Python pip配置国内源的方法
2020/02/14 Python
python 日志 logging模块详细解析
2020/03/31 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
意大利单身交友网站:Meetic
2020/07/12 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
杭州西湖英语导游词
2015/02/03 职场文书
学风建设主题班会
2015/08/17 职场文书