node.js - Node.js 从文件中删除前 N 个字节
问题描述
如何从二进制文件的开头删除(删除|修剪)N个字节而不将其加载到内存中?
我们有fs.ftruncate(fd, len, callback)
,它从文件末尾删除字节(如果它更大)。
如何从头开始剪切字节,或者在 Node.js 中从头开始修剪而不读取内存中的文件?
我需要类似truncateFromBeggining(fd, len, callback)
or的东西removeBytes(fd, 0, N, callback)
。
如果不可能,使用文件流最快的方法是什么?
在大多数文件系统上,您不能从文件的开头或中间“剪切”一部分,您只能在末尾截断它。
考虑到上述情况,我想,我们可能必须打开输入文件流,在第 N 个字节之后寻找,并将pipe
其余字节寻找到输出文件流。
解决方案
您要求操作系统文件系统操作:能够从文件的开头删除一些字节,而无需重写文件。
您要求的文件系统操作不存在,至少在 Linux / FreeBSD / MacOS / Windows 中是这样。
如果您的程序是文件的唯一用户并且它适合 RAM,那么最好的办法是将整个内容读入 RAM,然后重新打开文件进行写入,然后写出您要保留的部分。
或者您可以创建一个新文件。假设您的输入文件名为q
. 然后你会创建一个名为的文件,可能会new_q
附加一个流。您可以将所需的内容通过管道传输到新文件。然后您将取消链接(删除)输入文件q
并将输出文件重命名new_q
为q
.
小心:此取消链接/重命名操作将在没有可用的文件名时创建一小段时间q
。因此,如果其他程序试图打开它但没有找到它,它应该再试几次。
如果您正在创建队列方案,您可能会考虑使用其他方案来保存队列数据。这个文件读取/重写/取消链接/重命名序列有很多方法可能会在重负载下给你出错。(问我怎么知道当你有几个小时空闲时 ;-)redis
值得一看。
推荐阅读
- c - 无法在 C 中打印返回值
- oracle - listagg DB链接问题
- javascript - 如何将 JS 数组中的每个项目作为单独的 html 元素返回?
- javascript - 有没有办法只在使用 Angular js 的按钮单击时调用短代码?
- ios - 具有频繁数据源更新的 UITableView 的平滑滚动
- android - 从另一个类更新列表适配器
- javascript - 等待承诺回答
- javascript - 服务工作者状态失败但状态码返回 200
- wpf - 尽管有 ByRef,但可观察的集合什么都不是
- apache-camel - 如何使用 activemq 骆驼组件启用事务