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 相关文章推荐
使用正则替换变量
May 05 Javascript
纯js实现的论坛常用的运行代码的效果
Jul 15 Javascript
基于jquery的划词搜索实现(备忘)
Sep 14 Javascript
将查询条件的input、select清空
Jan 14 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
JS实现状态栏跑马灯文字效果代码
Oct 24 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
jQuery动态加载css文件实现方法
Jun 15 Javascript
设置cookie指定时间失效(实例代码)
May 28 Javascript
js使用html2canvas实现屏幕截取的示例代码
Aug 28 Javascript
Node.js 路由的实现方法
Jun 05 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中看实例学正则表达式
2006/12/25 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
Jquery 扩展方法
2010/05/06 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
python__name__原理及用法详解
2019/11/02 Python
python文件操作的简单方法总结
2019/11/07 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
Python-for循环的内部机制
2020/06/12 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
个人找工作的自我评价
2013/10/17 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书