首页 > 解决方案 > Node.js 从文件中删除前 N 个字节

问题描述

如何从二进制文件的开头删除(删除|修剪)N个字节而不将其加载到内存中?

我们有fs.ftruncate(fd, len, callback),它从文件末尾删除字节(如果它更大)。

如何从头开始剪切字节,或者在 Node.js 中从头开始修剪而不读取内存中的文件?

我需要类似truncateFromBeggining(fd, len, callback)or的东西removeBytes(fd, 0, N, callback)

如果不可能,使用文件流最快的方法是什么?

在大多数文件系统上,您不能从文件的开头或中间“剪切”一部分,您只能在末尾截断它。

考虑到上述情况,我想,我们可能必须打开输入文件流,在第 N 个字节之后寻找,并将pipe其余字节寻找到输出文件流。

标签: node.jsfilefilestreamtruncate

解决方案


您要求操作系统文件系统操作:能够从文件的开头删除一些字节,而无需重写文件。

您要求的文件系统操作不存在,至少在 Linux / FreeBSD / MacOS / Windows 中是这样。

如果您的程序是文件的唯一用户并且它适合 RAM,那么最好的办法是将整个内容读入 RAM,然后重新打开文件进行写入,然后写出您要保留的部分。

或者您可以创建一个新文件。假设您的输入文件名为q. 然后你会创建一个名为的文件,可能会new_q附加一个流。您可以将所需的内容通过管道传输到新文件。然后您将取消链接(删除)输入文件q并将输出文件重命名new_qq.

小心:此取消链接/重命名操作将在没有可用的文件名时创建一小段时间q。因此,如果其他程序试图打开它但没有找到它,它应该再试几次。

如果您正在创建队列方案,您可能会考虑使用其他方案来保存队列数据。这个文件读取/重写/取消链接/重命名序列有很多方法可能会在重负载下给你出错。(问我怎么知道当你有几个小时空闲时 ;-)redis值得一看。


推荐阅读