Javascript 如何移动文件句柄';没有实际读取数据的内部位置?

Javascript 如何移动文件句柄';没有实际读取数据的内部位置?,javascript,node.js,fs,Javascript,Node.js,Fs,我正在尝试使用fs.open和FileHandle在节点中逐字节读取二进制文件。使用FileHandle.read(缓冲区、偏移量、长度、位置),我可以: 将位置参数留空,在这种情况下,读取的每个数据块都会移动文件句柄的内部位置 提供一个position参数,在这种情况下,内部位置将保持不变 我想从文件中间的一个特定位置读取一个值(使用文件句柄。读取/一个位置),并基于该值,从文件中的另一个点顺序读取一些其他数据(使用文件句柄。 第一部分很简单。对于第二部分,我知道我可以: 维护一个自定义位置变

我正在尝试使用
fs.open
FileHandle
在节点中逐字节读取二进制文件。使用
FileHandle.read(缓冲区、偏移量、长度、位置)
,我可以:

  • 位置
    参数留空,在这种情况下,读取的每个数据块都会移动
    文件句柄
    的内部位置
  • 提供一个
    position
    参数,在这种情况下,内部位置将保持不变
  • 我想从文件中间的一个特定位置读取一个值(使用<代码>文件句柄。读取/<代码>一个位置),并基于该值,从文件中的另一个点顺序读取一些其他数据(使用<代码>文件句柄。 第一部分很简单。对于第二部分,我知道我可以:

  • 维护一个自定义位置变量,并将其提供给每次
    read
    调用
  • 从文件中读取一定数量的数据只是为了更改内部位置
  • 第一个解决方案是可行的,但有点麻烦,因为数据的结构相当复杂。第二种解决方案实际上并不可行,因为文件变得相当大,逐字节读取文件的全部目的是不将其内容的大块读取到内存中

    我还可以在
    文件句柄
    上构建自己的抽象,这样可以保持自己的内部位置并允许我修改它,但如果可以的话,我宁愿避免这样做


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

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

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

    position = bufferOrOptions.position || null;
    
    只需将该
    位置
    变量直接传递给本机代码绑定:

    const bytesRead = (await binding.read(handle.fd, buffer, offset, length,
                           position, kUsePromises)) || 0;
    
    因此,
    fs
    模块本身不跟踪文件位置,因此您无法在
    fs
    模块中“设置”文件位置。除了对nodejs内部进行黑客攻击之外,我不知道还有什么其他方法可以“设置”文件位置,除了您自己的建议,即覆盖各种方法以跟踪“当前”文件位置,然后能够将该文件位置设置为“当前”文件位置在进行任何API调用之前,未显式传递到文件位置的值

    来自C++,在这里它是STD文件库的一个内置部分,在NoDEJS中,对于它没有任何规定,这似乎总是很奇怪。如果查看其中可用的文件操作,可能libuv甚至没有文件位置感,因此这可能就是nodejs效仿的原因


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

    谢谢,我想我将构建一个小抽象。