node.js - Node.js同时读取和写入流到同一个文件
问题描述
TL;博士
我正在浏览许多解决方案,npm
并github
寻找可以让我read
同时write
在两个不同地方访问同一个文件的东西。到目前为止,我实际上很难找到这样的东西。是否有某种模块允许这样做?
背景
本质上,我的要求是在一个大文件中,我需要按以下顺序:
- 读
- 转换
- 写
理想情况下,用法如下:
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)并替换内容而不将所有内容加载到内存中。
我希望这是一个真实的用例,但我发现的所有实现实际上都将整个文件加载到内存中然后保存。我在这里错过了一个已知的模块还是需要实际编写这样的东西?
解决方案
嗯……似乎很难。:)
所以这里记录一下——我没有找到这样的模块,实际上与一些负责一个很好的文件内替换模块的人讨论了这个问题。没有办法解决这个问题,我决定从头开始编写它,它是:
该模块的工作原理很简单,即在可读流中消耗完字节之前不能写入任何字节,并且它在下面相当简单(结合fs.read/write
操作,注意读取和写入点)。
如果你觉得这很有用,我很高兴。:)
推荐阅读
- java - iframe 中的复选框 - 如何检查是否有复选框,如果是,请单击它
- html - 为什么我的引导下拉元素渲染不好?
- sql - SQL 中括号的规则。似乎没有工作
- java - Reactor rabbitmq AlreadyClosedException
- javascript - 循环遍历对象数组,并将它们转换为 UL 中的 LI 项
- dart - 如何在 Flutter 测试中模拟 TextField 上的按 ENTER
- c++ - QNetworkReplyHttpImplPrivate::_q_startOperation 被多次调用
- forms - Silverstripe 4.3 数据模型中的更改按钮
- amazon-ec2 - 是否可以在我的 cloudformation 模板中使用 cfn-signal 而不使用 cfn-init?
- vb.net-2010 - 如何解决 VB.NET 使用 sqldatabase 在位置 2 处没有行