node.js - 如果偏移量在文件范围内,为什么 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
如果文件具有正确的大小并且使用了正确的标志,为什么会发生此错误?
解决方案
你似乎误解了这些writeSync
论点。offset
指的是缓冲区中的位置,而不是文件中的位置。对于文件中的地址,使用position
.
错误消息来自这样一个事实,即系统无法从您指定的缓冲区中的位置开始在缓冲区中找到 4 个字节。
您的代码应为:
fs.writeSync(fd, pointerBuffer, 0, 4, j*4)
从文档:
offset
确定要写入的缓冲区部分,并且length
是一个整数,指定要写入的字节数。
position
指的是从应该写入此数据的文件开头的偏移量。如果typeof position !== 'number'
,则将数据写入当前位置。[..]
推荐阅读
- python - Python仅销毁tkinter子类小部件
- javascript - 去重的对象数组javascript
- spring - 带有 Spring Boot 的通用 jpa 存储库
- reactjs - 使用 graphql 片段传入数据
- java - Maven 拉取不需要的依赖项
- cassandra - fsync 提交日志延迟的原因
- .htaccess - .htaccess 重写包含下划线和参数的孤立 URL
- ajax - AJAX 代码仅在 iPad 上不起作用
- macos - 使用 cmake 构建 macos 框架时如何指定 (Un)Exported Symbols 文件?
- java - JPA 应用程序中的 Persistence.createEntityManagerFactory 错误