原文链接:
https://blog.risingstack.com/mastering-the-nodejs-core-modules-file-system-fs-module/
在这篇文章中,我们会看一下(Node.js的)文件系统模块,文件流和一些可选的文件模块。
想象一下这样的场景,你必须使用Node.js去完成一项任务…..
通过查
官方文档
,Google搜索解决方案或者在npm找一个可以解决这问题的模块,这任务看起来还是挺容易完成的。
嘛,这当然是可以的,但有时候核心模块就可以轻松地帮你完成工作(而不需要去查资料)。
通过
《掌握Node.js核心模块》
系列文章,你可以学习到核心模块中一些隐藏和不为人知的特性。我们也会推荐一些拓展核心模块功能的模块,对你日常的开发有极大的帮助。
1 2 3 4 5 6 7 8 9
// the async api const fs = require('fs') fs.unlink('/tmp/hello', (err) => { if (err) { return console.log(err) } console.log('successfully deleted /tmp/hello') })
事件循环
,使程序更加高效。
1 2 3 4 5 6 7 8 9 10
// the sync api const fs = require('fs') try { fs.unlinkSync('/tmp/hello') } catch (ex) { console.log(err) } console.log('successfully deleted /tmp/hello');
(然而)流在Node.js中是一件强大的武器,可以使程序占用更少的内存。
在Node.js中什么是文件流?
若要处理数据,流在Node.js中是最好的。你需要理解这三个概念:
source
- 数据来源对象(译者注:理解为水的来源),
pipeline
- 数据流向的过程(你可以在这过滤或者更新数据。译者注:理解为水管),
sink
- 数据最后存放的地方(译者注:理解为开了水龙头后接水的容器)。
如果需要知道更多知识,可以看下Substack的
Stream Handbook
.
你可以轻松地使用流复制文件,尽管文件模块不提供相应的功能:
1 2 3 4 5 6
// copy a file const fs = require('fs') const readableStream = fs.createReadStream('original.txt') var writableStream = fs.createWriteStream('copy.txt') readableStream.pipe(writableStream)
你可能会问:为什么我要这么做,不就是一个
cp
命令吗?
使用流去处理文件,
最大的好处是在此过程中你可以轻松地加工文件
,下面是一个压缩文件的例子:
1 2 3 4 5 6
const fs = require('fs') const zlib = require('zlib') fs.createReadStream('original.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('original.txt'))
Node.js支持
需要从npm中得到相应模块的帮助吗?
Learn more
inotify
,
在BSD系统中,它使用
kqueue
,
在OS X中,文件使用
kqueue
,目录使用
FSEvents
,
在SunOS中(包括Solaris和SmartOS),API是
event ports
,
在Windows系统中, 这功能依赖于
ReadDirectoryChangesW
。
注意:只有OS X和Windows系统支持递归选项,Linux不支持。
还有,回调函数中的
fileName
参数只在Linux和Windows系统中提供,因此你应该准备好相应的回退机制以防止它是
undefined
。
1 2 3 4 5
fs.watch('some/path', (eventType, fileName) => { if (!filename) { //filename is missing, handle it gracefully } })
lockfile
添加文件锁是非常简单的:
1 2 3 4 5 6 7 8 9 10 11 12
const lockFile = require('lockfile') lockFile.lock('some-file.lock', function (err) { // if the err happens, then it failed to acquire a lock. // if there was not an error, then the file was created, // and won't be deleted until we unlock it. // then, some time later, do: lockFile.unlock('some-file.lock', function (err) { }) })