首页 > 解决方案 > 如果偏移量在文件范围内,为什么 Node.js 会抱怨 ERR_OUT_OF_RANGE?

问题描述

我正在尝试通过一个 4 字节缓冲区以迭代偏移量覆盖预先生成的 1GB 文件的一些内容。

尽我所能,我使用了正确的标志:

const fd = fs.openSync(dataPath, "r+") // also tried "a+"

在此处输入图像描述

并且文件大小看起来在范围内:

let stats = fs.statSync(dataPath)
let fileSizeInBytes = stats["size"]
let fileSizeInMegabytes = fileSizeInBytes / 1000000
console.log("fileSizeInMegabytes", fileSizeInMegabytes) // => fileSizeInMegabytes 1000

但是当我尝试编写更新时:

const bufferSize = 74

let pointer = (timestampSet.size * 4) + 4
for (let j = 0; j < timestampSet.size; j++) {
  pointer += mapIterator.next().value * bufferSize
  const pointerBuffer = Buffer.alloc(4)
  pointerBuffer.writeUInt32BE(pointer, 0) // <Buffer 00 2e 87 e4>
  console.log("writing", pointerBuffer, "to file", dataPath, "at offset", j * 4)
  // writing <Buffer 00 2e 87 e4> to file E://data.odat at offset 4
  fs.writeSync(fd, pointerBuffer, j * 4, 4)
}
fs.close(fd).then(() => {
  console.log("write stream closed")
})

iterateProcess()

我得到错误:

RangeError [ERR_OUT_OF_RANGE]: The value of "length" is out of range. It must be <= 0. Received 4

如果文件具有正确的大小并且使用了正确的标志,为什么会发生此错误?

标签: node.js

解决方案


你似乎误解了这些writeSync论点。offset指的是缓冲区中的位置,而不是文件中的位置。对于文件中的地址,使用position.

错误消息来自这样一个事实,即系统无法从您指定的缓冲区中的位置开始在缓冲区中找到 4 个字节。

您的代码应为:

fs.writeSync(fd, pointerBuffer, 0, 4, j*4)

文档

offset确定要写入的缓冲区部分,并且length是一个整数,指定要写入的字节数。

position指的是从应该写入此数据的文件开头的偏移量。如果typeof position !== 'number',则将数据写入当前位置。[..]


推荐阅读