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 相关文章推荐
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
JS扩展方法实例分析
Apr 15 Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 Javascript
微信小程序 开发工具快捷键整理
Oct 31 Javascript
Javascript基础回顾之(一) 类型
Jan 31 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
动态Axios的配置步骤详解
Jan 12 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
npm 常用命令详解(小结)
Jan 17 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
python生成随机mac地址的方法
2015/03/16 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
浅谈Python协程
2020/06/17 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
2014年社区庆元旦活动方案
2014/03/08 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
新闻稿件写作范文
2015/07/18 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python