为何Node.js向文件写入Buffer时会出现部分字节丢失的问题?
问题根因
- 这是Windows平台文本模式/二进制模式文件打开方式的差异导致的,不属于
fs.writeSync接口的bug
具体原因
- NodeJS的
fs.openSync接口使用a作为flag时,Windows系统下默认以文本模式打开文件:文本模式会对特殊控制字符做转换/截断处理,你写入的0x00(NULL字符)会被系统过滤,导致实际写入文件的字节数少于预期 - 你遇到的5字节写入正常是Windows文本模式的处理逻辑随字节长度对齐规则变化的偶现表现,不代表问题不存在
修复方案
将打开文件的flag从a改为ab(二进制追加模式),明确指定以二进制方式操作文件,即可避免系统自动过滤控制字符的问题:
const fs = require('fs'); // 把第二个参数'a'改成'ab' let infoFile = fs.openSync('field.info', 'ab'); fs.writeSync(infoFile, Buffer.from([0x06, 0x00, 0x04, 0x00])) fs.closeSync(infoFile);
补充说明
- 跨平台操作二进制文件时,永远显式指定二进制flag(带
b后缀,比如rb/wb/ab),可以避免不同操作系统下文本模式的默认处理逻辑差异带来的异常 - 你看到的
fs.writeSync返回值和实际写入不符是正常表现:返回值是NodeJS层面传递给系统调用的字节数,系统层面的字符过滤是在内核写入阶段执行的,不会反向修改这个返回值
内容的提问来源于stack exchange,提问作者Nathan Goings
相关产品推荐
相关产品推荐

