Node.js对同一文件句柄两次调用readFile返回空,如何重置文件指针到起始位置?
问题原因
- Node.js中所有基于文件句柄的读取操作,都会自动更新文件的当前偏移量指针。你第一次调用
readFile/readFileSync已经将整个文件内容读取完毕,偏移量指针移动到了文件末尾,第二次读取时自然没有内容可以返回,所以得到空Buffer。
解决方案
你可以通过seek方法将文件偏移量重置到文件起始位置(偏移量为0),就能实现同一文件句柄的重复读取。分别对应异步和同步的写法如下:
const fs = require('fs') ;(async () => { // 异步API示例 const fd = await fs.promises.open('test.txt') const a1 = await fd.readFile() // 重置偏移量到文件开头 await fd.seek(0) const a2 = await fd.readFile() console.log({ a1, a2 }) // 此时a2和a1内容一致 // 同步API示例 const fd2 = fs.openSync('test.txt') const b1 = fs.readFileSync(fd2) // 重置偏移量到文件开头 fs.seekSync(fd2, 0) const b2 = fs.readFileSync(fd2) console.log({ b1, b2 }) // 此时b2和b1内容一致 // 用完记得关闭文件句柄释放资源 await fd.close() fs.closeSync(fd2) })()
- 异步场景调用文件句柄的
seek(0)方法即可重置指针 - 同步场景调用
fs.seekSync(文件句柄, 0)即可重置指针 - 注意:文件句柄使用完毕后需要手动调用close方法释放资源,避免资源泄漏
内容的提问来源于stack exchange,提问作者Colin D
相关产品推荐
相关产品推荐

