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 相关文章推荐
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
值得分享的JavaScript实现图片轮播组件
Nov 21 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
Jan 23 Javascript
JavaScript创建对象的七种方式全面总结
Aug 21 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
Aug 01 Javascript
JS中比较两个Object数组是否相等方法实例
Nov 11 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
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 不同编码下的字符串长度区分
2009/09/26 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
vue常用指令代码实例总结
2020/03/16 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
python怎么调用自己的函数
2020/07/01 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
教师求职信范文分享
2013/12/27 职场文书
消防安全检查制度
2014/02/04 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
市场营销计划书
2019/04/24 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android