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 相关文章推荐
学习YUI.Ext 第七天--关于View&JSONView
Mar 10 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
基于jquery 的一个progressbar widge
Oct 29 Javascript
改变隐藏的input中value的值代码
Dec 30 Javascript
javascript动画算法实例分析
Jul 31 Javascript
javascript笔记之匿名函数和闭包
Feb 06 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 Javascript
JavaScript生成简单等差数列
Nov 28 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
element-ui中select组件绑定值改变,触发change事件方法
Aug 24 Javascript
React 组件中的 bind(this)示例代码
Sep 16 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
Expandable "Detail" Table Rows
2007/08/29 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
three.js实现圆柱体
2018/12/30 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
Python中的rfind()方法使用详解
2015/05/19 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
python素数筛选法浅析
2018/03/19 Python
windows下python和pip安装教程
2018/05/25 Python
python实现人民币大写转换
2018/06/20 Python
python 读取文件并替换字段的实例
2018/07/12 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
网络安全方面的面试题
2015/11/04 面试题
Ejb技术面试题
2015/04/29 面试题
货代行业个人求职简历的自我评价
2013/10/22 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
市场调查策划方案
2014/06/10 职场文书
宣传普通话标语
2014/06/27 职场文书
小学运动会前导词
2015/07/20 职场文书