Node.js同时读取和写入流到同一个文件

Posted

技术标签:

【中文标题】Node.js同时读取和写入流到同一个文件【英文标题】:Node.js read and write stream to the same file at the same time 【发布时间】:2019-03-04 19:54:16 【问题描述】:

TL;DR

我正在浏览npmgithub 上的许多解决方案,寻找可以让我同时在两个不同位置将readwrite 访问同一文件的内容。到目前为止,我实际上很难找到这样的东西。是否有某种模块允许这样做?

背景

本质上我的要求是在一个大文件中我需要按以下顺序:

阅读 变换 写

理想的用法是这样的:

const fd = fs.open(file, "r+");
const read = createReadStreamSomehowFrom(fd);
const write = createWriteStreamSomehowFrom(fd);

read
   .pipe(new Transform(transform() ...))
   .pipe(write);

我可以使用标准 fs.create[Read/Write]Stream 做到这一点,但无法控制两个流的流动,如果我的写入位置超出读取位置,那么我正在阅读我刚刚写的东西......

用例和perl -p -i -e一样,异步读写同一个文件(意思是同一个inode),替换内容而不把所有东西都加载到内存中。

我希望这是一个真实的用例,但我发现的所有实现实际上都是将整个文件加载到内存中然后保存。我在这里错过了一个已知的模块还是需要实际编写这样的东西?

【问题讨论】:

【参考方案1】:

嗯……似乎很难。 :)

所以在这里记录一下——我没有找到这样的模块,实际上我和一些负责一个很好的文件内替换模块的人讨论了这个问题。看到没有办法解决这个问题,我决定从头开始编写它,它是:

signicode/rw-stream repo on github rw-stream at npm

该模块的工作原理很简单,即在可读流中消耗完字节之前不能写入任何字节,并且它在下面相当简单(一对fs.read/write ops 密切关注读取和写入点)。

如果你觉得这很有用,那我很高兴。 :)

【讨论】:

以上是关于Node.js同时读取和写入流到同一个文件的主要内容,如果未能解决你的问题,请参考以下文章

Node.js学习之路05——fs文件系统之文件的写入和读取

Node 读取 + 写入 + 路径问题

如何使用 Node.js 读取/写入图像?

node.js同步及异步读取写入删除文件1

Node.js的Buffer写入

在 Heroku 上使用 Node 读取、写入和存储 JSON