【问题标题】:How to move a FileHandle's internal position without actually reading data?如何在不实际读取数据的情况下移动 FileHandle 的内部位置?
【发布时间】:2021-12-26 07:50:38
【问题描述】:

我正在尝试使用fs.openFileHandle 在Node 中逐字节读取二进制文件。使用FileHandle.read(buffer, offset, length, position),我可以:

  1. position 参数留空,在这种情况下,读取的每个数据块都会移动FileHandle 的内部位置
  2. 提供position 参数,在这种情况下内部位置将保持不变

我想从文件中间的特定位置读取一个值(使用带有位置的FileHandle.read),并基于该值,从文件中的另一个点顺序读取一些其他数据(使用@ 987654328@ 没有位置)。

第一部分很简单。对于第二部分,我知道我可以:

  1. 维护一个自定义位置变量并将其提供给每个read 调用
  2. 从文件中读取一定量的数据只是为了改变内部位置

第一个解决方案是可行的,但有点麻烦,因为该数据的结构相当复杂。第二种解决方案实际上并不可行,因为文件变得相当大,并且逐字节读取文件的重点是不要将其内容的大块读取到内存中。

我还可以在FileHandle 上构建自己的抽象,它会保持自己的内部位置并允许我对其进行更改,但如果可以的话,我宁愿避免这样做。

有没有一种方法可以让我跳过FileHandle 中任意数量的字节,或者手动设置其内部位置?

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    fs 库对文件位置采取不干涉策略,将其完全交给 libuv 和操作系统来处理。因此,FileHandle 对象中没有保存位置。

    你可以看到相关的代码here它只是这样做的:

    position = bufferOrOptions.position || null;
    

    然后将 position 变量直接传递给本机代码绑定:

    const bytesRead = (await binding.read(handle.fd, buffer, offset, length,
                           position, kUsePromises)) || 0;
    

    因此,fs 模块本身不会跟踪文件位置,因此您不能在fs 模块中“设置”它。除了对nodejs内部进行黑客攻击之外,除了您自己建议覆盖各种方法以跟踪“当前”文件位置然后能够设置该文件之外,我不知道有任何其他方法可以“设置”文件位置在任何未显式传入文件位置的 API 调用继续之前将位置设置为“当前”值。

    来自 C++,这是 std 文件库的内置部分,这在 nodejs 中对我来说总是很奇怪,因为没有提供它。如果您查看其中可用的文件操作here,那么似乎 libuv 甚至不知道文件位置,所以也许这就是 nodejs 效仿的原因。

    无论如何,很抱歉我无法提供任何神奇而简单的答案,但希望这能解释这方面的情况,您可以决定如何最好地继续。

    【讨论】:

    • 谢谢,我想我会建立一点抽象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2011-12-12
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多