如何在不实际读取数据的情况下移动 FileHandle 的内部位置?
How to move a FileHandle's internal position without actually reading data?
我正在尝试使用 fs.open
和 FileHandle
在 Node 中逐字节读取二进制文件。使用 FileHandle.read(buffer, offset, length, position)
,我可以:
- 将
position
参数留空,在这种情况下,读取的每个数据块都会移动 FileHandle
的内部位置
- 提供一个
position
参数,在这种情况下内部位置将保持不变
我想从文件中间的特定位置读取一个值(使用 FileHandle.read
和一个位置),并基于该值,顺序读取文件中另一个点的一些其他数据文件(使用没有位置的 FileHandle.read
)。
第一部分很简单。对于第二部分,我知道我可以:
- 维护自定义位置变量并将其提供给每个
read
调用
- 从文件中读取一定量的数据只是为了改变内部位置
第一个解决方案是可行的,但有点麻烦,因为该数据的结构非常复杂。第二种解决方案并不可行,因为文件变得相当大,逐字节读取文件的全部目的是不要将大块内容读入内存。
我也可以在 FileHandle
上构建自己的抽象,它会保持自己的内部位置并允许我更改它,但如果可以的话,我宁愿避免这样做。
有没有一种方法可以让我跳过 FileHandle
中任意数量的字节,或者手动设置它的内部位置?
fs
库对文件位置采取不干涉策略,将其留给 libuv 和 OS 来完全处理。所以,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++,在 C++ 中这是 std 文件库的内置部分,这对我来说在 nodejs 中一直很奇怪,因为没有提供它。如果您查看其中可用的文件操作,似乎 libuv 甚至不知道文件位置 here 所以也许这就是 nodejs 效仿的原因。
无论如何,抱歉,我无法提供任何神奇、简单的答案,但希望这能解释这方面的现状,您可以决定如何最好地继续。
我正在尝试使用 fs.open
和 FileHandle
在 Node 中逐字节读取二进制文件。使用 FileHandle.read(buffer, offset, length, position)
,我可以:
- 将
position
参数留空,在这种情况下,读取的每个数据块都会移动FileHandle
的内部位置 - 提供一个
position
参数,在这种情况下内部位置将保持不变
我想从文件中间的特定位置读取一个值(使用 FileHandle.read
和一个位置),并基于该值,顺序读取文件中另一个点的一些其他数据文件(使用没有位置的 FileHandle.read
)。
第一部分很简单。对于第二部分,我知道我可以:
- 维护自定义位置变量并将其提供给每个
read
调用 - 从文件中读取一定量的数据只是为了改变内部位置
第一个解决方案是可行的,但有点麻烦,因为该数据的结构非常复杂。第二种解决方案并不可行,因为文件变得相当大,逐字节读取文件的全部目的是不要将大块内容读入内存。
我也可以在 FileHandle
上构建自己的抽象,它会保持自己的内部位置并允许我更改它,但如果可以的话,我宁愿避免这样做。
有没有一种方法可以让我跳过 FileHandle
中任意数量的字节,或者手动设置它的内部位置?
fs
库对文件位置采取不干涉策略,将其留给 libuv 和 OS 来完全处理。所以,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++,在 C++ 中这是 std 文件库的内置部分,这对我来说在 nodejs 中一直很奇怪,因为没有提供它。如果您查看其中可用的文件操作,似乎 libuv 甚至不知道文件位置 here 所以也许这就是 nodejs 效仿的原因。
无论如何,抱歉,我无法提供任何神奇、简单的答案,但希望这能解释这方面的现状,您可以决定如何最好地继续。