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 相关文章推荐
JavaScript事件列表解说
Dec 22 Javascript
javascript时区函数介绍
Sep 14 Javascript
jQuery分别获取选中的复选框值的示例
Jun 17 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
原生javascript实现匀速运动动画效果
Feb 26 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
详解webpack的proxyTable无效的解决方案
Jun 15 Javascript
详解如何使用微信小程序云函数发送短信验证码
Mar 13 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
微信小程序加载机制及运行机制图解
Nov 27 Javascript
小程序自动化测试的示例代码
Aug 11 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
js 数组操作代码集锦
2009/04/28 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
Python代码的打包与发布详解
2014/07/30 Python
用Python编写web API的教程
2015/04/30 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
python检索特定内容的文本文件实例
2018/06/05 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
小学开学典礼主持词
2014/03/19 职场文书
单位实习鉴定评语
2015/01/04 职场文书
部门2015年度工作总结
2015/04/29 职场文书
叶问观后感
2015/06/15 职场文书
音乐研修感悟
2015/11/18 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python
yolov5返回坐标的方法实例
2022/03/17 Python
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python