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 12 Javascript
一个简单的javascript类定义例子
Sep 12 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
Apr 11 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 Javascript
SpringMVC返回json数据的三种方式
Dec 10 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
Apr 13 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
mpvue 单文件页面配置详解
Dec 02 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
Vue实现PC端靠边悬浮球的代码
May 09 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 和 MySQL 时区的一点总结
2008/03/26 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
asp 的 分词实现代码
2007/05/24 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
Bootstrap模态窗口源码解析
2017/02/08 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
餐饮管理自我介绍信
2014/01/15 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
学习型班组申报材料
2014/05/31 职场文书
律师函格式范本
2015/05/27 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL